Web Mvc Test

Тема дорожной карты · Spring Boot

@WebMvcTest — аннотация тестового среза Spring Boot, загружающая только слой Spring MVC — бины @RestController, @Controller, @ControllerAdvice, @JsonComponent и Filter — без загрузки полного ApplicationContext, что делает тесты контроллеров значительно быстрее, чем @SpringBootTest. Аннотация принимает необязательный атрибут controllers для дополнительного сужения контекста до одного класса контроллера, и авто-конфигурирует MockMvc так, чтобы HTTP-взаимодействия симулировались внутри процесса без открытия сетевого сокета, позволяя делать утверждения о кодах состояния, JSON тела ответа и HTTP-заголовках с помощью MockMvcResultMatchers. Зависимости, объявленные в контроллере — как правило, бины @Service или @Repository — не загружаются срезом @WebMvcTest и должны быть заменены @MockBean, тогда как SecurityFilterChain Spring Security активируется по умолчанию, чтобы тестовые аннотации @WithMockUser и @WithSecurityContext корректно работали для проверки поведения аутентификации и авторизации. @WebMvcTest — стандартный подход для тестирования валидации запросов (@Valid, @RequestBody), согласования контента, обработки исключений через @ControllerAdvice и привязки @PathVariable / @RequestParam без запуска базы данных или внешнего сервиса. В хорошо слоистом Spring Boot-проекте @WebMvcTest покрывает HTTP-контракт, @DataJpaTest с Testcontainers — слой персистентности, а @SpringBootTest с WebTestClient — критические сквозные пользовательские сценарии.

Как это работает

Web Mvc Test: @SpringBootTest бутит полный контекст для интеграционных тестов (медленно, но реалистично). @WebMvcTest + MockMvc для controller-layer unit-тестов (без DB, без полного контекста — быстро). @DataJpaTest для repository-тестов на H2/Testcontainers DB. Testcontainers (Java интеграция) поднимают реальные DB/queues/сервисы в Docker per test — самый high-fidelity вариант. REST Assured для fluent end-to-end API-тестов. Spring Boot test slices держат тесты быстрыми, бутая только нужный слой.

Когда применять

Дефолт Testcontainers вместо H2 — та же DB в тестах + prod = без сюрпризов dialect. Slice-тесты (@WebMvcTest, @DataJpaTest) для быстрой обратной связи; @SpringBootTest для настоящих интеграционных тестов. Mock external HTTP-сервисы через WireMock. Целитесь в testing pyramid — много unit, меньше slice, ещё меньше full integration.

Типичные ошибки

Ловушки Web Mvc Test: только @SpringBootTest везде (медленно + flaky); H2 для теста против Postgres prod (H2 + Postgres SQL отличаются); flaky-тесты из-за random ports без proper cleanup; мокают всё (тестируете моки, не код).

Связанные понятия

Полезные ресурсы