Как переписать интеграционный тест для ModelAndView в Java - PullRequest
0 голосов
/ 31 марта 2020

У меня был этот контроллер

@GetMapping("/popular")
    public List<User> getPopularUsers() {
        return handler.getPopularUsers();
}

и тест интеграции для него, который работал правильно:

mockMvc.perform(get("/popular"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("[0].userId").value(372152))
            .andExpect(jsonPath("[1].userId").value(398729));

Теперь я изменил свой контроллер, и вместо него возвращается ModelAndView Список:

@GetMapping("/popular")
    public ModelAndView getPopularUsers(Map<String, Object> map) {
        List<User> popularUsers = handler.getPopularUsers();
        map.put("users", popularUsers);
        return new ModelAndView("popular-users", map);
}

Может кто-нибудь подсказать, как переписать тест для нового контроллера? Я нашел несколько примеров использования библиотеки Hamcrest, но я действительно не понимаю, как получить некоторые значения из списка

1 Ответ

1 голос
/ 01 апреля 2020

Для проверки случая ModelAndView, Spring MVC Test имеет несколько MVC сопоставлений, таких как ModelResultMatchers и ViewResultMatchers

Если вы хотите проверить какое-либо значение в вашем списке, вы можете использовать метод public <T> ResultMatcher attribute(String name, Matcher<T> matcher) из ModelResultMatchers.

Предыдущие проверки можно переписать так:

.andExpect(model().attribute("users",hasItem(hasProperty("id", equalTo(372152)))));
.andExpect(model().attribute("users",hasItem(hasProperty("id", equalTo(398729)))));

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

.andExpect(view().name("popular-users"))

Полный список всех MockMvcResultMatchers можно найти здесь

Полный список всех возможных методов для ModelResultMatchers можно найти здесь

Полный список всех возможных методы для ViewResultMatchers можно найти здесь

...