Ответ
Spring предоставляет мощный набор инструментов в модуле Spring Test для модульного, интеграционного и сквозного тестирования.
1. Интеграционное тестирование с @SpringBootTest:
Загружает полный контекст приложения. Идеально для тестирования взаимодействия нескольких компонентов.
@SpringBootTest // Загружает весь контекст
@AutoConfigureMockMvc // Настраивает MockMvc
class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc; // Для тестирования веб-слоя
@Autowired
private UserRepository userRepository; // Реальный репозиторий
@MockBean
private EmailService emailService; // Заглушка для внешнего сервиса
@Test
void createUser_ShouldReturnCreated() throws Exception {
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content("{"name": "John"}"))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.name").value("John"));
}
}
2. Срезы тестирования (Test Slices): Загружают только необходимую часть контекста, что делает тесты быстрее.
@WebMvcTest— тестирует только контроллеры, без загрузки сервисов и репозиториев.@WebMvcTest(UserController.class) // Загружает только веб-слой class UserControllerTest { @Autowired MockMvc mockMvc; @MockBean UserService userService; // Зависимости нужно мокать }@DataJpaTest— тестирует JPA-компоненты, использует встроенную БД.@DataJpaTest class UserRepositoryTest { @Autowired TestEntityManager entityManager; @Autowired UserRepository repository; @Test void findByEmail_ShouldReturnUser() { ... } }@JsonTest— тестирует сериализацию/десериализацию JSON.@RestClientTest— тестирует REST-клиенты.
3. Моки и заглушки:
@MockBean— добавляет мок в Spring-контекст (заменяет реальный бин).@SpyBean— создает шпиона (spy) для реального бина.
4. Утилиты:
TestRestTemplate/WebTestClient— для тестирования работающего приложения (через HTTP).@TestPropertySource— для переопределения свойств в тестах.@Sql— для выполнения SQL-скриптов перед тестом.
Стандартный стек зависимостей (spring-boot-starter-test):
- JUnit 5, AssertJ, Hamcrest
- Mockito
- Spring Test & Spring Boot Test
- JSONassert, JsonPath