Что делает аннотация @WebMvcTest в Spring Boot?

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

Ответ

@WebMvcTest — это аннотация Spring Boot для срезового (slice) тестирования веб-слоя приложения. Она фокусируется только на компонентах Spring MVC, не загружая полный контекст приложения.

Основные цели:

  • Тестирование контроллеров (@Controller, @RestController).
  • Проверка маппинга запросов, валидации, обработки исключений.
  • Изоляция: Автоматически настраивает только релевантные для MVC бины (например, @Controller, @ControllerAdvice, @JsonComponent, WebMvcConfigurer).
  • Отключение: Не загружает бины, помеченные @Service, @Repository, @Component (их нужно мокировать).

Типичная структура теста:

@WebMvcTest(UserController.class) // Загружает только UserController и связанную MVC-инфраструктуру
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc; // Главный инструмент для тестирования MVC без запуска сервера

    @MockBean
    private UserService userService; // Зависимость контроллера заменяется моком

    @Test
    void getUser_ShouldReturnUser() throws Exception {
        User mockUser = new User(1L, "John");
        given(userService.findById(1L)).willReturn(mockUser);

        mockMvc.perform(get("/api/users/1"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$.name").value("John"));
    }
}

Что не входит в контекст @WebMvcTest: Полноценные сервисы, репозитории, безопасность (только ее MVC-часть), JPA. Для их тестирования используйте @SpringBootTest.