如何使用分页测试 Spring MVC 控制器?
How to test Spring MVC controller with pagination?
我在为我的 Spring 引导 MVC Web 项目测试分页控制器时遇到问题,该项目使用 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";
}
我已经尝试使用以下测试段来计算内容项(最初它将 return 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)
我已经护目镜但没有运气。谁能帮我举个例子来测试处理存储库中的可分页对象的控制器?
是否有任何替代方法可以使用分页测试列表?请帮忙。
提前致谢!
您正在测试属性 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 实用程序 类。通常我在这里省略它们 https://github.com/EuregJUG-Maas-Rhine/site/blob/ea5fb0ca6e6bc9b8162d5e83a07e32d6fc39d793/src/test/java/eu/euregjug/site/web/IndexControllerTest.java#L172-L191
您的 "contents" 在模型中它不是集合类型,而是页面类型。因此,您应该为 Page class 而不是 Collection 使用语义。从页面语义来看,它是 getTotalElements() 所以它是模型中的 pojo 字段 totalElements
andExpect(model().attribute("contents", Matchers.hasProperty("totalElements", equalTo(0L))));
我在为我的 Spring 引导 MVC Web 项目测试分页控制器时遇到问题,该项目使用 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";
}
我已经尝试使用以下测试段来计算内容项(最初它将 return 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)
我已经护目镜但没有运气。谁能帮我举个例子来测试处理存储库中的可分页对象的控制器?
是否有任何替代方法可以使用分页测试列表?请帮忙。
提前致谢!
您正在测试属性 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 实用程序 类。通常我在这里省略它们 https://github.com/EuregJUG-Maas-Rhine/site/blob/ea5fb0ca6e6bc9b8162d5e83a07e32d6fc39d793/src/test/java/eu/euregjug/site/web/IndexControllerTest.java#L172-L191
您的 "contents" 在模型中它不是集合类型,而是页面类型。因此,您应该为 Page class 而不是 Collection 使用语义。从页面语义来看,它是 getTotalElements() 所以它是模型中的 pojo 字段 totalElements
andExpect(model().attribute("contents", Matchers.hasProperty("totalElements", equalTo(0L))));