← Назад к вопросам
Что такое @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));
}
}
Ключевые особенности
- MockMvc — объект для выполнения HTTP-запросов в тестах
- @MockBean — мокирует зависимости сервисов
- Гибкость — можно тестировать разные HTTP методы (GET, POST, PUT, DELETE)
- Assertions — проверка статус-кодов, тела ответа, заголовков
Когда использовать?
- Тестирование логики маршрутизации
- Проверка валидации входных данных
- Тестирование обработки исключений
- Проверка формата ответов
- Быстрые unit-тесты контроллеров
@WebMvcTest — отличный выбор для быстрого и изолированного тестирования веб-слоя, когда вам не нужна вся инфраструктура приложения.