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

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

mockMvc.perform(get("/accounts/1"))
       .andExpect(status().isOk());

MockMvcResultMatchers.* предоставляет ряд ожиданий, некоторые из которых дополнительно вложены в более подробные ожидания.

Ожидания делятся на две общие категории. Первая категория утверждений проверяет свойства ответа (например, статус ответа, заголовки и содержимое). Это самые важные результаты, которые нужно утверждать.

Вторая категория утверждений выходит за рамки ответа. Эти утверждения позволяют вам проверять конкретные аспекты Spring MVC, например, какой метод контроллера обработал запрос, было ли вызвано и обработано исключение, каково содержимое модели, какое представление было выбрано, какие атрибуты были добавлены и т. д. Они также позволяют вам проверять конкретные аспекты сервлета, такие как атрибуты запроса и сеанса.

Следующий тест утверждает, что привязка или проверка не удались:

mockMvc.perform(post("/persons"))
    .andExpect(status().isOk())
    .andExpect(model().attributeHasErrors("person"));

Часто при написании тестов бывает полезно сбросить результаты выполненного запроса. Вы можете сделать это следующим образом, где print() - статический импорт из MockMvcResultHandlers:

mockMvc.perform(post("/persons"))
    .andDo(print())
    .andExpect(status().isOk())
    .andExpect(model().attributeHasErrors("person"));

Пока обработка запроса не вызывает необработанного исключения, метод print() выводит все доступные данные результатов в System.out. Существует также метод log() и два дополнительных варианта метода print(), один из которых принимает OutputStream, а другой - Writer. Например, при вызове print(System.err) данные результатов печатаются в System.err, а при вызове print(myWriter) результаты выводятся в настраиваемый модуль записи. Если вы хотите, чтобы данные результатов регистрировались, а не печатались, вы можете вызвать метод log(), который регистрирует данные результатов как одно сообщение DEBUG в категории ведения журнала org.springframework.test.web.servlet.result.

В некоторых случаях вы можете захотеть получить прямой доступ к результату и проверить то, что невозможно проверить в противном случае. Этого можно добиться, добавив .andReturn() после всех остальных ожиданий, как показано в следующем примере:

MvcResult mvcResult = mockMvc
                      .perform(post("/persons"))
                      .andExpect(status().isOk())
                      .andReturn();
// ...

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

standaloneSetup(new SimpleController())
    .alwaysExpect(status().isOk())
    .alwaysExpect(content()
                  .contentType("application/json;charset=UTF-8"))
    .build()

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

Если содержимое ответа JSON содержит гиперссылки, созданные с помощью Spring HATEOAS, вы можете проверить полученные ссылки с помощью выражений JsonPath, как показано в следующем примере:

mockMvc.perform(get("/people")
       .accept(MediaType.APPLICATION_JSON))
       .andExpect(jsonPath("$.links[?(@.rel == 'self')].href")
                  .value("http://localhost:8080/people"));

Когда содержимое ответа XML содержит ссылки гипермедиа, созданные с помощью Spring HATEOAS, вы можете проверить полученные ссылки с помощью выражений XPath:

Map<String, String> ns = Collections.singletonMap("ns", "http://www.w3.org/2005/Atom");
mockMvc.perform(get("/handle").accept(MediaType.APPLICATION_XML))
    .andExpect(xpath("/person/ns:link[@rel='self']/@href", ns)
               .string("http://localhost:8080/people"));


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


Комментарии

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

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

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

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