Как протестировать контроллер Spring MVC с разбиением на страницы?

Я столкнулся с проблемой тестирования контроллера с разбиением на страницы для моего веб-проекта Spring boot MVC, в котором используется Thymeleaf . Мой контроллер выглядит следующим образом:

@RequestMapping(value = "admin/addList", method = RequestMethod.GET)
    public String druglist(Model model, Pageable pageable) {

        model.addAttribute("content", new ContentSearchForm());
        Page<Content> results = contentRepository.findContentByContentTypeOrByHeaderOrderByInsertDateDesc(
                ContentType.Advertisement.name(), null, pageable);


        PageWrapper<Content> page = new PageWrapper<Content>(results, "/admin/addList");
        model.addAttribute("contents", results);
        model.addAttribute("page", page);
        return "contents/addcontents";

    }

Я пробовал с этим следующим тестовым сегментом, который будет подсчитывать элементы содержимого (изначально он вернет 0 элементов с нумерацией страниц).

andExpect(view().name("contents/addcontents"))
    .andExpect(model().attributeExists("contents"))
    .andExpect(model().attribute("contents", hasSize(0)));

но получая следующую ошибку (тест был в порядке, до разбиения на страницы):

 java.lang.AssertionError: Model attribute 'contents'
Expected: a collection with size <0>
     but: was <Page 0 of 0 containing UNKNOWN instances>
 at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)

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

Существует ли какой-либо альтернативный способ проверить список с разбиением на страницы? Пожалуйста помоги.

Заранее спасибо!


person mnhmilu    schedule 02.07.2017    source источник


Ответы (2)


вы тестируете атрибут contents. contents относится к типу Page, поскольку вы добавили его под этим именем в модель (model.addAttribute("contents", results);) Page не имеет размера атрибута, это не список.

Вместо этого вы хотите проверить общее количество элементов:

.andExpect(view().name("contents/addcontents"))
.andExpect(model().attributeExists("contents"))
.andExpect(model().attribute("contents", Matchers.hasProperty("totalElements", equalTo(0L))));

Для вашего удобства я включил служебные классы Hamcrest. Обычно я опускаю их, как здесь -L191" rel="nofollow noreferrer">https://github.com/EuregJUG-Maas-Rhine/site/blob/ea5fb0ca6e6bc9b8162d5e83a07e32d6fc39d793/src/test/java/eu/euregjug/site/web/IndexControllerTest.java#L172- L191

person Michael Simons    schedule 02.07.2017

Ваше «содержимое» в модели — это не тип коллекции, это тип страницы. Поэтому вы должны использовать семантику для класса Page, а не для Collection. Из семантики страницы это getTotalElements(), поэтому это поле totalElements pojo в модели

andExpect(model().attribute("contents", Matchers.hasProperty("totalElements", equalTo(0L))));
person xyz    schedule 02.07.2017