Интеграционное тестирование в Spring: Spring MVC Test Framework, асинхронные запросы

Асинхронные запросы Servlet 3.0, поддерживаемые в Spring MVC, работают, выходя из потока контейнера сервлета и позволяя приложению вычислять ответ асинхронно, после чего выполняется асинхронная отправка для завершения обработки в потоке контейнера сервлета.

В Spring MVC Test можно протестировать асинхронные запросы, сначала подтвердив созданное значение async, затем вручную выполнив асинхронную отправку и, наконец, проверив ответ. Ниже приведен пример теста для методов контроллера, которые возвращают DeferredResult, Callable или реактивный тип, например Reactor Mono:

@Test
void test() throws Exception {
    MvcResult mvcResult = this.mockMvc.perform(get("/path"))
            .andExpect(status().isOk()) // Статус ответа на проверку не изменился
            .andExpect(request().asyncStarted()) // Асинхронная обработка должна быть запущена
            .andExpect(request().asyncResult("body")) // Подождите и подтвердите результат async
            .andReturn();

    this.mockMvc.perform(asyncDispatch(mvcResult)) // Вручную выполните отправку ASYNC (поскольку нет работающего контейнера)
            .andExpect(status().isOk()) // Проверить окончательный ответ
            .andExpect(content().string("body"));
}

Потоковые ответы

В Spring MVC Test нет встроенных опций для тестирования потоковых ответов без контейнера. Приложения, использующие параметры потоковой передачи Spring MVC, могут использовать WebTestClient для выполнения сквозных интеграционных тестов на работающем сервере. Это также поддерживается в Spring Boot, где вы можете протестировать работающий сервер с помощью WebTestClient. Еще одно преимущество - возможность использовать StepVerifier из проекта Reactor, который позволяет декларировать ожидания в потоке данных.

Фильтр регистрации

При настройке экземпляра MockMvc вы можете зарегистрировать один или несколько экземпляров фильтра сервлетов, как показано в следующем примере:

mockMvc = standaloneSetup(new PersonController())
          .addFilters(new CharacterEncodingFilter()).build();

Зарегистрированные фильтры вызываются через MockFilterChain из spring-test, а последний фильтр делегирует DispatcherServlet.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки