Какие инструменты Spring существуют для написания тестов?

«Какие инструменты Spring существуют для написания тестов?» — вопрос из категории Тестирование, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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