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

Что делает slice-тест вроде @WebMvcTest по сравнению с @SpringBootTest?

MiddleТестирование Spring BootSpring BootSpring Boot >=3.4
Ещё спрашивают так:
  • Что такое slice-тесты в Spring Boot?
Коротко

@SpringBootTest поднимает весь контекст — медленно, но реалистично. Slice-тесты — узкий срез: @WebMvcTest (контроллеры, фильтры, MockMvc), @DataJpaTest (репозитории и база), @JsonTest. Зависимости среза подменяются моками.

  • В @WebMvcTest сервисы — @MockitoBean (Boot 3.4+, раньше @MockBean)
  • Slice быстрее и проверяет одну область: маппинг, валидацию, коды ответов, JSON
  • Контексты кэшируются — разные моки ломают кэш и замедляют набор тестов

А ещё @DataJpaTest по умолчанию на встроенной базе — лучше Testcontainers

Подробно

Смысл в скорости и фокусе: тест контроллера проверяет маршрутизацию, сериализацию, валидацию и коды ответов, и для этого не нужны ни база, ни брокер. Аналогично устроены @DataJpaTest (только слой персистентности, по умолчанию в транзакции с откатом после теста) и @JsonTest. @SpringBootTest поднимает контекст целиком — это уместно для сквозных сценариев, но заметно дороже. Важная деталь про производительность набора тестов: Spring кэширует контексты между тестовыми классами по ключу конфигурации, поэтому каждый уникальный набор моков или свойств порождает новый контекст. Много разнородных @MockBean — частая причина того, что тесты идут минутами.

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

  • Различие объёма контекста.
  • Основные slice-аннотации.
  • Моки и кэширование контекста.

Частые ошибки

  • Использовать @SpringBootTest везде и получить медленный набор тестов.
  • Плодить уникальные комбинации @MockBean и ломать кэширование контекста.

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

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

Показать варианты и ответ
  • ✗Поднимает полный контекст со всеми бинами, но запрещает любые обращения к базе
  • ✓Поднимает только web-слой, а сервисы подменяются моками — контекст меньше
  • ✗Запускает приложение на реальном порту с полным набором бинов
  • ✗Отличается только именем аннотации

Что спросят дальше

  • Почему @DataJpaTest откатывает транзакцию после теста?
  • Как ключ кэширования контекста влияет на время прогона?

Разбор темы

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

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

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

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

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