Класс MockMvc Flashcards
Для чего используется MockMvc
MockMvc используется для имитации HTTP-запросов и проверки ответов контроллеров, не поднимая полноценное веб-приложение. Это позволяет выполнять изолированные и быстрые тесты.
Что такое MockMvc
MockMvc — это класс в Spring, который позволяет тестировать контроллеры Spring MVC, отправляя HTTP-запросы к ним без запуска реального веб-сервера.
Как создать экземпляр MockMvc
MockMvc можно создать с помощью аннотации @AutoConfigureMockMvc в интеграционных тестах или через MockMvcBuilders для более контролируемой настройки:
MockMvc mockMvc = MockMvcBuilders
.webAppContextSetup(webApplicationContext)
.build();
Как выполнить HTTP-запрос с помощью MockMvc
Для выполнения HTTP-запроса используется метод perform(), который отправляет запрос к определенному маршруту (например, GET, POST и т.д.):
mockMvc
.perform(get(“/example”));
Какие типы запросов поддерживает MockMvc
MockMvc поддерживает все основные HTTP методы: GET, POST, PUT, DELETE, PATCH, и другие, например:
mockMvc
.perform(post(“/example”));
Как проверить HTTP-ответ с помощью MockMvc
Для проверки ответа можно использовать метод andExpect(), который позволяет тестировать статус кода, тело ответа, заголовки и другие параметры:
mockMvc
.perform(get(“/example”))
.andExpect(status().isOk()) .andExpect(content().string(“Expected response”));
Как передавать параметры в запросах MockMvc
Параметры можно передавать через методы param() для стандартных параметров или queryParam() для параметров в строке запроса:
mockMvc
.perform(get(“/example”)
.param(“key”, “value”));
Как передать тело запроса в формате JSON с помощью MockMvc
Для отправки данных в формате JSON используется метод content() в комбинации с contentType():
mockMvc
.perform(post(“/example”)
.contentType(MediaType.APPLICATION_JSON)
.content(“{"key":"value"}”));
Как протестировать JSON-ответ от контроллера
Вы можете использовать метод jsonPath() для проверки содержимого JSON-ответа:
mockMvc
.perform(get(“/example”))
.andExpect(jsonPath(“$.key”).value(“value”));
Как имитировать авторизованного пользователя в тестах с MockMvc
Для имитации аутентифицированного пользователя можно использовать аннотацию @WithMockUser или метод SecurityMockMvcRequestPostProcessors.user():
mockMvc
.perform(get(“/example”)
.with(user(“username”)));
Как мокировать зависимости в тестах с использованием MockMvc
Чтобы тестировать контроллеры изолированно от сервисов, вы можете использовать аннотацию @MockBean для мокирования зависимостей:
@MockBean
private ExampleService exServ;
Можно ли тестировать исключения, выбрасываемые контроллером, с MockMvc
Да, с помощью метода andExpect() можно проверять, что контроллер выбрасывает нужное исключение:
mockMvc
.perform(get(“/example”))
.andExpect(status().isNotFound()
.andExpect(result -> assertTrue(result.getResolvedException() instanceof CustomException));
Как тестировать асинхронные контроллеры с MockMvc
MockMvc поддерживает тестирование асинхронных методов через методы andReturn() и asyncDispatch():
MvcResult mvcResult = mockMvc
.perform(get(“/async-endpoint”))
.andReturn();
mockMvc
.perform(asyncDispatch(mvcResult))
.andExpect(status().isOk());
Как использовать MockMvc для тестирования файловых загрузок и загрузки файлов
Для тестирования загрузки файлов используется метод fileUpload():
mockMvc
.perform(multipart(“/upload”)
.file(new MockMultipartFile(“file”, “test.txt”, “text/plain”, “test data”
.getBytes())))
.andExpect(status().isOk());
Как проверить заголовки HTTP-ответа
Для проверки заголовков ответа используйте метод header() в комбинации с andExpect():
mockMvc
.perform(get(“/example”))
.andExpect(header().string(“Content-Type”, “application/json”));