Вопрос с собеседования · 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 минут бесплатно.

Разбор собеседования