Интеграционное тестирование в Spring: Spring MVC Test Framework

Spring MVC Test framework обеспечивает первоклассную поддержку для тестирования кода Spring MVC с помощью свободного API, который вы можете использовать с JUnit, TestNG или любым другим фреймворком тестирования. Он построен на mock объектах Servlet API из модуля spring-test и, следовательно, не использует работающий контейнер сервлетов. Он использует DispatcherServlet для обеспечения полного поведения среды выполнения Spring MVC и обеспечивает поддержку загрузки фактической конфигурации Spring с TestContext framework в дополнение к автономному режиму, в котором вы можете вручную создавать экземпляры контроллеров и тестировать их по одному.

Spring MVC Test также обеспечивает поддержку на стороне клиента для тестирования кода, использующего RestTemplate. Клиентские тесты имитируют ответы сервера, а также не используют работающий сервер.

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

Серверные тесты

Вы можете написать простой модульный тест для контроллера Spring MVC с помощью JUnit или TestNG. Для этого создайте экземпляр контроллера, внедрите его с фиктивными или заглушенными зависимостями и вызовите его методы (передавая MockHttpServletRequest, MockHttpServletResponse и другие по мере необходимости). Однако при написании такого модульного теста многое остается непроверенным: например, сопоставления запросов, привязка данных, преобразование типов, проверка и многое другое. Кроме того, другие методы контроллера, такие как @InitBinder, @ModelAttribute и @ExceptionHandler, также могут быть вызваны как часть жизненного цикла обработки запроса.

Цель Spring MVC Test - предоставить эффективный способ тестирования контроллеров путем выполнения запросов и генерации ответов через фактический DispatcherServlet.

Spring MVC Test основан на “mock” реализациях Servlet API, доступных в модуле spring-test. Это позволяет выполнять запросы и генерировать ответы без необходимости запуска в контейнере сервлетов. По большей части, все должно работать так же, как и во время выполнения, с некоторыми заметными исключениями. В следующем примере JUnit на основе Jupiter используется Spring MVC Test:

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@SpringJUnitWebConfig(locations = "test-servlet-context.xml")
class ExampleTests {

    MockMvc mockMvc;

    @BeforeEach
    void setup(WebApplicationContext wac) {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
    }

    @Test
    void getAccount() throws Exception {
        this.mockMvc.perform(get("/accounts/1")
                .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().contentType("application/json"))
            .andExpect(jsonPath("$.name").value("Lee"));
    }
}

В Kotlin доступен специальный MockMvc DSL.

Предыдущий тест основан на поддержке WebApplicationContext TestContext framework для загрузки конфигурации Spring из файла конфигурации XML, расположенного в том же пакете, что и тестовый класс, но также поддерживаются конфигурации на основе Java и Groovy.

Экземпляр MockMvc используется для выполнения запроса GET к /accounts/1 и проверки того, что полученный ответ имеет статус 200, тип содержимого - application/json, а тело ответа имеет свойство JSON с именем name со значением Lee. Синтаксис jsonPath поддерживается проектом Jayway JsonPath.

Статические импорты

Для свободного API в примере из предыдущего раздела требуется несколько статических импортов, таких как MockMvcRequestBuilders.*, MockMvcResultMatchers.* и MockMvcBuilders.*. Самый простой способ найти эти классы - поискать типы, соответствующие MockMvc. Если вы используете Eclipse или Spring Tools для Eclipse, обязательно добавьте их в качестве "избранных статических элементов" в настройках Eclipse в разделе Java → Editor → Content Assist → Favorites. Это позволяет использовать помощник по содержанию после ввода первого символа имени статического метода. Другие IDE (например, IntelliJ) могут не требовать дополнительной настройки. Проверьте поддержку автозавершения кода для статических членов.


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


Комментарии

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

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

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

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