Тестирование веб-приложений в Spring
Веб-приложения являются центральным элементом многих проектов, а тестирование REST-контроллеров помогает убедиться, что API работает корректно. Для этих целей Spring предлагает инструменты, такие как MockMvc и аннотация @WebMvcTest.
Основы тестирования контроллеров с MockMvc и @WebMvcTest
1. Использование MockMvc
MockMvc — это инструмент для тестирования REST-контроллеров без необходимости запуска всего приложения.
Он позволяет:
Отправлять HTTP-запросы к контроллерам.
Проверять их ответы (статус, заголовки, тело и т. д.).
Работать с сериализацией/десериализацией JSON.
Создайте тестовый класс с аннотацией @WebMvcTest:
2. Аннотация @WebMvcTest
Аннотация @WebMvcTest конфигурирует Spring так, чтобы загружались только веб-компоненты, связанные с тестируемыми контроллерами. Это делает тесты быстрыми и изолированными.
Особенности:
Загружает только контекст веб-слоя:
Регистрируются только контроллеры, обработчики ошибок и связанные с ними компоненты.
Другие части приложения, такие как сервисы или репозитории, не загружаются.
Использование @MockitoBean:
Для замены зависимостей контроллеров мок-объектами.
Импорт дополнительных компонентов: Если нужно задействовать специфическую конфигурацию, можно использовать @Import.
Пример:
3. Методы MockMvc: perform, andExpect, andReturn
Метод perform
Отправляет HTTP-запрос к указанному маршруту контроллера. Он принимает объект MockHttpServletRequestBuilder, который позволяет настроить запрос.
Пример GET-запроса:
Пример POST-запроса:
Метод andExpect
Проверяет различные аспекты ответа:
HTTP-статус.
Заголовки.
Тело ответа.
Пример:
Метод andReturn
Возвращает полный объект ответа, который можно анализировать для более сложных проверок.
Пример:
4. Работа с сериализацией и тестирование JSON-данных
Для тестирования контроллеров, возвращающих JSON, полезно использовать библиотеку Jackson (по умолчанию в Spring Boot).
Пример сериализации объекта в JSON:
Пример десериализации JSON в объект:
#Java #Training #Spring #Testing #Mockito #TestingWeb
Веб-приложения являются центральным элементом многих проектов, а тестирование REST-контроллеров помогает убедиться, что API работает корректно. Для этих целей Spring предлагает инструменты, такие как MockMvc и аннотация @WebMvcTest.
Основы тестирования контроллеров с MockMvc и @WebMvcTest
1. Использование MockMvc
MockMvc — это инструмент для тестирования REST-контроллеров без необходимости запуска всего приложения.
Он позволяет:
Отправлять HTTP-запросы к контроллерам.
Проверять их ответы (статус, заголовки, тело и т. д.).
Работать с сериализацией/десериализацией JSON.
Создайте тестовый класс с аннотацией @WebMvcTest:
@WebMvcTest(controllers = MyController.class)
public class MyControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private MyService myService;
// Тесты будут здесь
}
2. Аннотация @WebMvcTest
Аннотация @WebMvcTest конфигурирует Spring так, чтобы загружались только веб-компоненты, связанные с тестируемыми контроллерами. Это делает тесты быстрыми и изолированными.
Особенности:
Загружает только контекст веб-слоя:
Регистрируются только контроллеры, обработчики ошибок и связанные с ними компоненты.
Другие части приложения, такие как сервисы или репозитории, не загружаются.
Использование @MockitoBean:
Для замены зависимостей контроллеров мок-объектами.
Импорт дополнительных компонентов: Если нужно задействовать специфическую конфигурацию, можно использовать @Import.
Пример:
@WebMvcTest(controllers = MyController.class)
@Import(MyCustomConfig.class)
public class MyControllerTest {
// Тесты
}
3. Методы MockMvc: perform, andExpect, andReturn
Метод perform
Отправляет HTTP-запрос к указанному маршруту контроллера. Он принимает объект MockHttpServletRequestBuilder, который позволяет настроить запрос.
Пример GET-запроса:
mockMvc.perform(get("/api/items"))
.andExpect(status().isOk());
Пример POST-запроса:
mockMvc.perform(post("/api/items")
.content("{\"name\":\"Test Item\"}")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isCreated());
Метод andExpect
Проверяет различные аспекты ответа:
HTTP-статус.
Заголовки.
Тело ответа.
Пример:
mockMvc.perform(get("/api/items"))
.andExpect(status().isOk()) // Проверка HTTP-статуса
.andExpect(content().contentType(MediaType.APPLICATION_JSON)) // Проверка заголовка Content-Type
.andExpect(jsonPath("$.size()").value(3)); // Проверка JSON-данных
Метод andReturn
Возвращает полный объект ответа, который можно анализировать для более сложных проверок.
Пример:
MvcResult result = mockMvc.perform(get("/api/items"))
.andExpect(status().isOk())
.andReturn();
String responseBody = result.getResponse().getContentAsString();
Assertions.assertTrue(responseBody.contains("ItemName"));
4. Работа с сериализацией и тестирование JSON-данных
Для тестирования контроллеров, возвращающих JSON, полезно использовать библиотеку Jackson (по умолчанию в Spring Boot).
Пример сериализации объекта в JSON:
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(new Item(1L, "Test Item"));
Пример десериализации JSON в объект:
String jsonResponse = "{\"id\":1,\"name\":\"Test Item\"}";
Item item = objectMapper.readValue(jsonResponse, Item.class);
Assertions.assertEquals("Test Item", item.getName());
#Java #Training #Spring #Testing #Mockito #TestingWeb
Написание тестов для CRUD REST API
Пример контроллера
Тестирование CRUD операций
Особенности
@MockitoBean для сервиса:
Изолирует тест от реального сервиса.
Позволяет задавать поведение с помощью Mockito.
Тестирование сериализации/десериализации:
Используйте ObjectMapper для работы с JSON.
Работа с jsonPath:
Удобный способ проверки JSON-структур.
#Java #Training #Spring #Testing #Mockito #TestingWeb
Пример контроллера
@RestController
@RequestMapping("/api/items")
public class ItemController {
private final ItemService itemService;
@Autowired
public ItemController(ItemService itemService) {
this.itemService = itemService;
}
@GetMapping
public List<Item> getAllItems() {
return itemService.getAllItems();
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Item createItem(@RequestBody Item item) {
return itemService.saveItem(item);
}
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteItem(@PathVariable Long id) {
itemService.deleteItem(id);
}
}
Тестирование CRUD операций
@WebMvcTest(controllers = ItemController.class)
public class ItemControllerTest {
@Autowired
private MockMvc mockMvc;
@MockitoBean
private ItemService itemService;
@Test
public void testGetAllItems() throws Exception {
List<Item> items = Arrays.asList(new Item(1L, "Item1"), new Item(2L, "Item2"));
Mockito.when(itemService.getAllItems()).thenReturn(items);
mockMvc.perform(get("/api/items"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.size()").value(2))
.andExpect(jsonPath("$[0].name").value("Item1"));
}
@Test
public void testCreateItem() throws Exception {
Item item = new Item(1L, "NewItem");
Mockito.when(itemService.saveItem(Mockito.any(Item.class))).thenReturn(item);
mockMvc.perform(post("/api/items")
.content("{\"name\":\"NewItem\"}")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isCreated())
.andExpect(jsonPath("$.name").value("NewItem"));
}
@Test
public void testDeleteItem() throws Exception {
mockMvc.perform(delete("/api/items/1"))
.andExpect(status().isNoContent());
}
}
Особенности
@MockitoBean для сервиса:
Изолирует тест от реального сервиса.
Позволяет задавать поведение с помощью Mockito.
Тестирование сериализации/десериализации:
Используйте ObjectMapper для работы с JSON.
Работа с jsonPath:
Удобный способ проверки JSON-структур.
#Java #Training #Spring #Testing #Mockito #TestingWeb