Рубрики
Без рубрики

Java – Использование Spring для тестирования REST API

Вступление В предыдущем посте мы рассмотрели создание контроллера REST в Spring и как его разделить… С пометкой java, spring, postman.

Вступление

В предыдущем посте мы рассмотрели создание контроллера REST в Spring и то, как отделить бизнес-логику от логики ответа и запроса с помощью сервисов.

Теперь, когда мы написали код, давайте посмотрим, как его протестировать.

Тестирование конечной точки REST с помощью Spring

При написании тестов мы можем рассмотреть модульные тесты, которые отвечают за тестирование отдельного модуля, обычно включающего определенную бизнес-логику, или мы можем рассмотреть интеграционные тесты, которые отличаются от первых в том смысле, что они используются для тестирования более сложного потока, состоящего из множества блоков код и обычно влечет за собой какую-то логику “использования приложения”.

Для тестирования конечной точки полезно написать интеграционный тест, который может протестировать весь поток использования конечной точки, а именно, контролировать, какие параметры запроса отправляются вместе с запросом, токенами, учетными данными авторизации и любой дополнительной необходимой информацией, и для заданного набора параметров запроса мы можем затем утверждать если ответ будет таким, как мы ожидаем. Мы можем сделать это, проверив содержимое ответа или код состояния (если мы ожидаем, что запрос будет выполнен успешно, у нас должен быть, например, код ответа 200).

Давайте резюмируем @RestController мы уже писали ранее:

@RestController
public class GreetingsResource {

    private static final Log LOG = LogFactory.getLog(GreetingsResource.class);

//1
    @PostMapping(value = "/greet", consumes = MediaType.APPLICATION_JSON_VALUE)
//2
    public ResponseEntity greet(@RequestBody PersonDTO person) {
        if(person==null) {
            LOG.error("Request Body can not be null");
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        }
        GreetingService greetingService = new GreetingService(person);
        GreetDTO response = greetingService.getGreeting();
        if(response==null){
            return new ResponseEntity<>(HttpStatus.EXPECTATION_FAILED);
        }

        return new ResponseEntity<>(response, HttpStatus.OK);
    }
}

Давайте посмотрим, как мы можем использовать эту текущую реализацию, чтобы написать для нее хороший набор интеграционных тестов.

Представляем класс MockMvc Spring

Spring обладает множеством полезных функций для поддержки тестирования приложений, написанных с его помощью, что является одной из его самых замечательных функций. Мы рассмотрим только часть того, что мы можем сделать с фреймворком, посмотрев на MockMvc класс.

MockMvc имеет два метода, которые мы можем использовать:

  • get DispatcherServlet() : возвращает базовый Диспетчерский сервлет экземпляр, с помощью которого был инициализирован этот MockMvc . Это предназначено для использования в сценарии обработки пользовательских запросов, где компонент обработки запросов делегируется DispatcherServlet во время выполнения и, следовательно, должен быть введен вместе с ним.

  • выполнить(RequestBuilder RequestBuilder) : выполнить запрос и вернуть тип, который позволяет связывать дальнейшие действия, такие как утверждение ожиданий, с результатом.

Наиболее полезным при написании тестов на практике является метод performance |/, который позволяет нам очень четко создавать запрос и утверждать его ожидаемый ответ благодаря сборщику, и это наиболее часто используемый метод.

Идея заключается в том, что мы можем создать запрос так, как мы хотим или ожидаем, что это произойдет в реальном сценарии, и мы можем передать этот построенный запрос методу perform для утверждения в нем полезных вещей.

Подготовка тестового класса для поддержки MockMvc

Поскольку девиз Spring Boot – соглашение, а не конфигурация, нам нужно очень мало кода жгута проводов, чтобы настроить наш тестовый класс для поддержки MockMvc:

@AutoConfigureMockMvc
@SpringBootTest
class GreetingsControllerTest {

    @Autowired
    private MockMvc mockMvc;
    (...)

Ничего не может быть проще, чем это!

Мы просто используем аннотацию @AutoConfigureMockMvc для настройки автоматически подключаемого MockMvc, который мы будем использовать. Эта аннотация добавляет полезные значения по умолчанию к экземпляру autowired, который мы будем использовать для тестов, например, регистрацию фильтров приложений из контекста приложения в нашем экземпляре и включение Selenium webDrivers, если это необходимо, среди прочего. Установив эти строительные леса, мы, наконец, можем написать наши интеграционные тесты.

Использование MockMvc для написания интеграционных тестов

Мы можем использовать эту конфигурацию для написания наших интеграционных тестов. Обратите внимание, как мы тестируем два разных сценария: успешный, следуя счастливому пути, и неудачный, когда тело запроса пустое, и мы получим статус “нет содержимого”.:

@AutoConfigureMockMvc
@SpringBootTest
class GreetingsControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void failsIfRequestBodyEmpty() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/greet")
       .contentType(MediaType.APPLICATION_JSON)
       .content()
       .andExpect(status().is(204))); //no content status

    @Test
    public void successIfGreetInRequestBody() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/greet")
       .contentType(MediaType.APPLICATION_JSON)
       .content("{\"name\": \"John\", \"age\":15}")
       .andExpect(status().is(200))); //OK

Как мы видим, мы можем объявлять наши запросы простым способом и благодаря Mockmvcrequestbuilders действительно легко прочитать тест и посмотреть, что происходит и каковы наши ожидания от конкретного тела запроса, точно так же, как это было бы в реальном случае использования.

Мы указываем URL-адрес для конечной точки, тип содержимого, содержимое в теле запроса, а затем мы можем сказать, чего мы ожидаем, и подтвердить статус ответа на запрос.

Мы можем сделать гораздо больше с помощью MockMvc , который будет рассмотрен позже в следующем посте.

Вывод

Используя возможности Spring и используя MockMvc, мы можем увидеть, как писать декларативные тесты, которые очень близки к реальному сценарию использования, поэтому они обеспечивают максимальную отдачу.

Оригинал: “https://dev.to/brunooliveira/java-using-spring-to-test-a-rest-api-o93”