← Назад к вопросам

Что такое @WebMvcTest?

2.2 Middle🔥 221 комментариев
#Spring Boot и Spring Data#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

@WebMvcTest: Аннотация для тестирования контроллеров

@WebMvcTest — это аннотация в Spring Framework, которая используется для создания срезового теста (slice test) контроллеров без полной загрузки приложения. Она позволяет тестировать слой представления (Controllers, Interceptors, Exception Handlers) в изоляции от остального приложения.

Зачем нужна @WebMvcTest?

Основная цель — ускорить тестирование контроллеров за счёт загрузки только необходимых компонентов Spring MVC:

  • Быстрота: загружается только веб-слой, остальное исключается
  • Изоляция: можно мокировать зависимости (сервисы, репозитории)
  • Простота: не требует полного контекста приложения
  • Фокус: сосредоточение на тестировании HTTP-слоя

Как использовать @WebMvcTest?

Примеры:

@WebMvcTest(UserController.class)
class UserControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private UserService userService;
    
    @Test
    void testGetUser() throws Exception {
        // Arrange
        when(userService.findById(1L))
            .thenReturn(new User(1L, "John"));
        
        // Act & Assert
        mockMvc.perform(get(\"/api/users/1\"))
            .andExpect(status().isOk())
            .andExpect(jsonPath(\"$.name\").value(\"John\"));
    }
}

Что загружается в контексте?

При использовании @WebMvcTest Spring загружает:

  • Controllers — указанные контроллеры
  • Interceptors — перехватчики запросов
  • Exception Handlers (@ControllerAdvice)
  • Formatters и Converters — преобразователи типов
  • Validators — валидаторы
  • Filter Beans — фильтры

НЕ загружаются:

  • Services, Repositories
  • Database
  • Security (по умолчанию)
  • External dependencies

@WebMvcTest vs @SpringBootTest

Аспект@WebMvcTest@SpringBootTest
СкоростьБыстро ✓Медленно
КонтекстТолько MVCПолный контекст
МокированиеНужно мокировать зависимостиМожно использовать реальные
ИспользованиеUnit-тесты контроллеровИнтеграционные тесты

Пример с MockBean

@WebMvcTest(ProductController.class)
class ProductControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private ProductService productService;
    
    @Test
    void testCreateProduct() throws Exception {
        // Arrange
        ProductDTO dto = new ProductDTO(\"Laptop\", 1000.0);
        Product saved = new Product(1L, \"Laptop\", 1000.0);
        
        when(productService.create(any(ProductDTO.class)))
            .thenReturn(saved);
        
        // Act & Assert
        mockMvc.perform(post(\"/api/products\")
            .contentType(MediaType.APPLICATION_JSON)
            .content(\"{\\\"name\\\":\\\"Laptop\\\",\\\"price\\\":1000.0}\"))
            .andExpect(status().isCreated())
            .andExpect(jsonPath(\"$.id\").value(1));
    }
}

Ключевые особенности

  1. MockMvc — объект для выполнения HTTP-запросов в тестах
  2. @MockBean — мокирует зависимости сервисов
  3. Гибкость — можно тестировать разные HTTP методы (GET, POST, PUT, DELETE)
  4. Assertions — проверка статус-кодов, тела ответа, заголовков

Когда использовать?

  • Тестирование логики маршрутизации
  • Проверка валидации входных данных
  • Тестирование обработки исключений
  • Проверка формата ответов
  • Быстрые unit-тесты контроллеров

@WebMvcTest — отличный выбор для быстрого и изолированного тестирования веб-слоя, когда вам не нужна вся инфраструктура приложения.