Получить доступ

Что делает 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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем