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

Вы можете выполнять запросы, которые используют любой метод HTTP, как показано в следующем примере:

mockMvc.perform(post("/hotels/{id}", 42)
       .accept(MediaType.APPLICATION_JSON));

Вы также можете выполнять запросы загрузки файлов, которые внутренне используют MockMultipartHttpServletRequest, чтобы не было фактического синтаксического анализа составного запроса. Скорее, вы должны настроить его, как в следующем примере:

mockMvc.perform(multipart("/doc")
       .file("a1", "ABC".getBytes("UTF-8")));

Вы можете указать параметры запроса в стиле шаблона URI, как показано в следующем примере:

mockMvc.perform(get("/hotels?thing={thing}", "somewhere"));

Вы также можете добавить параметры запроса сервлета, которые представляют параметры запроса или формы, как показано в следующем примере:

mockMvc.perform(get("/hotels").param("thing", "somewhere"));

Если код приложения полагается на параметры запроса сервлета и не проверяет строку запроса явно (как это часто бывает), не имеет значения, какой вариант вы используете. Однако имейте в виду, что параметры запроса, предоставленные с шаблоном URI, декодируются, в то время как параметры запроса, предоставленные с помощью метода param(…), как ожидается, уже будут декодированы.

В большинстве случаев предпочтительно оставлять контекстный путь и путь сервлета вне URI запроса. Если необходимо выполнить тестирование с полным URI запроса, обязательно установите contextPath и servletPath соответственно, чтобы сопоставления запросов работали, как показано в следующем примере:

mockMvc.perform(get("/app/main/hotels/{id}")
       .contextPath("/app")
       .servletPath("/main"))

В предыдущем примере было бы обременительно задавать contextPath и servletPath для каждого выполняемого запроса. Вместо этого вы можете настроить свойства запроса по умолчанию, как показано в следующем примере:

class MyWebTests {

    MockMvc mockMvc;

    @BeforeEach
    void setup() {
        mockMvc = standaloneSetup(new AccountController())
            .defaultRequest(get("/")
            .contextPath("/app").servletPath("/main")
            .accept(MediaType.APPLICATION_JSON)).build();
    }
}

Предыдущие свойства влияют на каждый запрос, выполняемый через экземпляр MockMvc. Если то же свойство также указано в данном запросе, оно переопределяет значение по умолчанию. Вот почему метод HTTP и URI в запросе по умолчанию не имеют значения, так как они должны быть указаны в каждом запросе.


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


Комментарии

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

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

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

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