Лучшие практики Spring HATEOAS/MockMvc/JsonPath

Я пишу модульные тесты для бэкэнда Spring HATEOAS, используя MockMvc и JsonPath. Чтобы проверить ссылки, содержащиеся в ответе, я делаю что-то вроде:

@Test
public void testListEmpty() throws Exception {
    mockMvc.perform(get("/rest/customers"))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON))
            .andExpect(jsonPath("$.links", hasSize(1))) // make sure links only contains self link
            .andExpect(jsonPath("$.links[?(@.rel=='self')]", hasSize(1))) //  make sure the self link exists 1 time
            .andExpect(jsonPath("$.links[?(@.rel=='self')].href", contains("http://localhost/rest/customers{?page,size,sort}"))) // test self link is correct
            .andExpect(jsonPath("$.links[?(@.rel=='self')][0].href", is("http://localhost/rest/customers{?page,size,sort}"))) // alternative to test self link is correct
            .andExpect(jsonPath("$.content", hasSize(0))); // make sure no content elements exists
}

Однако мне интересно, есть ли какие-то передовые методы, которые я должен использовать, чтобы упростить себе задачу, например:

  • Ссылка для тестирования содержит http://localhost, что кажется неправильным. Могу ли я использовать помощник Spring MovkMvc для определения хоста?
  • С JsonPath сложно проверить, содержит ли массив элемент, в котором 2 атрибута имеют определенное значение. Таким образом, массив должен содержать ссылку на себя с определенным значением. Есть ли лучший способ проверить это, чем указано выше. Это также сыграет роль при тестировании ошибок проверки для полей с сообщениями об ошибках.

Я видел технику, как показано ниже, в некоторых сообщениях блога:

.andExpect(jsonPath("$.fieldErrors[*].path", containsInAnyOrder("title", "description")))
.andExpect(jsonPath("$.fieldErrors[*].message", containsInAnyOrder(
    "The maximum length of the description is 500 characters.",
    "The maximum length of the title is 100 characters.")));

Но это вовсе не гарантирует, что заголовок имеет конкретное сообщение об ошибке. Также может быть, что в заголовке неправильно указано «Максимальная длина описания — 500 символов». но испытание пройдет успешно.


person Marcel Overdijk    schedule 29.08.2014    source источник


Ответы (2)


Вы можете использовать Traverson (включенный в Spring HATEOAS) для перехода по ссылкам в тестах.

Если вы используете Spring Boot, я бы предпочел использовать @WebIntegrationTest("server.port=0"), а не MockMvc, так как в некоторых случаях поведение немного отличалось от реального приложения.

Вы можете найти пример в моем посте: Реализация HAL Hypermedia REST API с использованием Spring HATEOAS< /а>. Также просмотрите ссылку тесты в примере проекта.

person Nicus    schedule 20.05.2016

Один из подходов, который решает проблему http://localhost, не жертвуя при этом необходимостью проверки двух атрибутивных ограничений элемента массива, заключается в использовании сопоставителя org.hamcrest.CoreMatchers.hasItem(org.hamcrest.Matcher nestedMatcher). Тест, который вы показали выше, теперь становится:

.andExpect(jsonPath("$.links[?(@.rel=='self')].href", hasItem(endsWith("/rest/customers{?page,size,sort}"))))
.andExpect(jsonPath("$.links[?(@.rel=='self')][0].href", hasItem(endsWith("/rest/customers{?page,size,sort}"))))
person chaserb    schedule 31.05.2019