Вопрос с собеседования · Spring
Как протестировать REST-контроллер Spring с MockMvc?
JuniorТестирование Spring Boot
Ещё спрашивают так:
- Как проверить JSON-ответ контроллера в тесте?
Коротко
MockMvc выполняет запрос к контроллеру без настоящего HTTP-сервера, проходя через всю цепочку Spring MVC: маршрутизацию, сериализацию, валидацию, обработчики ошибок. Запрос строят perform(get(...)/post(...)) с телом и заголовками, проверяют status(), jsonPath() для полей ответа, header(). Тестируют и ошибки: невалидное тело — 400, нет ресурса — 404, нет прав — 401/403.
- contentType(APPLICATION_JSON) и content(json) — для тела POST
- jsonPath("$.items.length()").value(3) — проверка массива
- В срезе @WebMvcTest сервисы — моки
А ещё Проверять контракт ответа, а не внутренности контроллера
Подробно
mvc.perform(post("/orders")
.contentType(MediaType.APPLICATION_JSON)
.content("""
{"productId": 10, "quantity": 2}
"""))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.id").exists())
.andExpect(header().exists("Location"));
mvc.perform(post("/orders")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"quantity\": -1}"))
.andExpect(status().isBadRequest());Что хотят услышать
- Запрос без сервера через цепочку MVC.
- perform, status, jsonPath.
- Тесты ошибок и валидации.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗MockMvc поднимает встроенный Tomcat на случайном порту и шлёт настоящие HTTP-запросы
- ✓Прогоняет запрос через Spring MVC без сервера; проверки — status(), jsonPath()
- ✗Проверяет только успешные ответы: ошибки 400 и 404 в MockMvc не воспроизводятся
- ✗MockMvc вызывает метод контроллера напрямую, минуя валидацию и обработку ошибок
Связанные вопросы
Партнёр платформы
Разбор собеседования
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.