Вопрос с собеседования · Spring

Как писать тесты в Spring Boot — @SpringBootTest и тестовые срезы?

JuniorТестирование Spring Boot
Ещё спрашивают так:
  • Чем @SpringBootTest отличается от @WebMvcTest?
  • Что такое @MockitoBean?
Коротко

@SpringBootTest поднимает весь контекст приложения — для интеграционных тестов, медленно. Срезы поднимают только нужный слой: @WebMvcTest — контроллеры с MockMvc, @DataJpaTest — репозитории с базой, @JsonTest — сериализация. Зависимости слоя подменяют @MockitoBean (раньше @MockBean). Бизнес-логику лучше тестировать обычными модульными тестами без Spring — они быстрее всего. Настоящую базу в тестах даёт Testcontainers.

  • Срез быстрее полного контекста в разы
  • Контекст кэшируется между тестами с одинаковой конфигурацией — лишние @MockitoBean ломают кэш
  • Тестовые настройки — application-test.yml и @ActiveProfiles("test")

А ещё Пирамида: много модульных, меньше срезов, немного полных интеграционных

Подробно

@WebMvcTest(OrderController.class)
class OrderControllerTest {
    @Autowired MockMvc mvc;
    @MockitoBean OrderService service;

    @Test
    void returns404WhenNotFound() throws Exception {
        when(service.find(1L)).thenReturn(Optional.empty());
        mvc.perform(get("/orders/1")).andExpect(status().isNotFound());
    }
}

@DataJpaTest
class OrderRepositoryTest { /* тесты запросов */ }

Что хотят услышать

  • @SpringBootTest против срезов.
  • @MockitoBean для зависимостей.
  • Модульные тесты без Spring.
  • Testcontainers для базы.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗@WebMvcTest поднимает весь контекст вместе с базой, но без встроенного веб-сервера
  • ✗Срезы медленнее полного контекста, поэтому их используют только для отладки
  • ✗Срезы поднимают весь контекст, как @SpringBootTest, но автоматически подменяют все бины моками
  • ✓@SpringBootTest — весь контекст, а срезы (@WebMvcTest, @DataJpaTest) — только нужный слой

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования