Spring mvc 单元测试返回PagedResources的Spring MVC控制器
我正在用SpringBoot1.4.1、SpringDataJPA和SpringDataTest构建一个应用程序 我有以下控制器,我想用它返回分页帐户:Spring mvc 单元测试返回PagedResources的Spring MVC控制器,spring-mvc,junit,mockito,spring-data-jpa,paging,Spring Mvc,Junit,Mockito,Spring Data Jpa,Paging,我正在用SpringBoot1.4.1、SpringDataJPA和SpringDataTest构建一个应用程序 我有以下控制器,我想用它返回分页帐户: @RequestMapping(method=RequestMethod.GET) public HttpEntity<PagedResources<Account>> getAccounts( Pageable pageable, PagedResourcesAssembler ass
@RequestMapping(method=RequestMethod.GET)
public HttpEntity<PagedResources<Account>> getAccounts(
Pageable pageable,
PagedResourcesAssembler assembler,
@RequestParam(value="name", required = false) String name,
@RequestParam(value="username", required = false) String username,
@RequestParam(value="email", required = false) String email,
@RequestParam(value="lastName", required = false) String lastName,
@RequestParam(value="size", required = true, defaultValue = "10") Integer size,
@RequestParam(value="page", required = true, defaultValue = "0") int page,
@RequestParam(value="sort", required = false, defaultValue = "username") String sort,
@RequestParam(value="direction", required = false, defaultValue = "asc") String direction,
UriComponentsBuilder uriBuilder,
HttpServletRequest request,
HttpServletResponse response) {
// form page request
AccountList list = null;
Page<Account> resultPage = null;
Direction sortDirection = Direction.ASC;
if(direction.equals("desc")) {
sortDirection = Direction.DESC;
}
PageRequest pReq = new PageRequest(page, size, sortDirection, sort);
resultPage = accountService.findAll(pReq);
return new ResponseEntity<>(assembler.toResource(resultPage), HttpStatus.OK);
}
我将@EnableSpringDataWebSupport注释添加到我的web配置中,但错误仍然存在。当按原样运行应用程序时,控制器工作正常,我将获得分页帐户作为JSON响应。但我不知道如何测试我的控制器
有没有人知道如何解决这个特定问题,或者如何对通常返回分页内容的Spring MVC控制器进行单元测试?我通过从控制器构造函数中删除可分页的分页内容来解决这个问题,因为我根本不需要它。然后PagedResourcesAssembler汇编程序抛出了错误
org.springframework.beans.BeanInstantiationException:
Failed to instantiate [org.springframework.data.web.PagedResourcesAssembler]:
No default constructor found; nested exception is java.lang.NoSuchMethodException:
org.springframework.data.web.PagedResourcesAssembler.<init>()
org.springframework.beans.BeanInstantiationException:
未能实例化[org.springframework.data.web.PagedResourcesAssembler]:
未找到默认构造函数;嵌套异常为java.lang.NoSuchMethodException:
org.springframework.data.web.PagedResourcesAssembler.()
我深入探讨了ResourceAssembler的主题,并提出了以下解决方案:
控制器:
@RequestMapping(method=RequestMethod.GET)
public ResponseEntity<PagedResources<AccountResource>> getAccounts(
@RequestParam(value="name", required = false) String name,
@RequestParam(value="username", required = false) String username,
@RequestParam(value="email", required = false) String email,
@RequestParam(value="lastName", required = false) String lastName,
@RequestParam(value="size", required = true, defaultValue = "10") Integer size,
@RequestParam(value="page", required = true, defaultValue = "0") int page,
@RequestParam(value="sort", required = false, defaultValue = "username") String sort,
@RequestParam(value="direction", required = false, defaultValue = "asc") String direction,
UriComponentsBuilder uriBuilder,
HttpServletRequest request,
HttpServletResponse response) {
// Build page request
AccountList list = null;
Page<Account> resultPage = null;
Direction sortDirection = Direction.ASC;
if(direction.equals("desc")) {
sortDirection = Direction.DESC;
}
PageRequest pReq = new PageRequest(page, size, sortDirection, sort);
resultPage = accountService.findAll(pReq);
HateoasPageableHandlerMethodArgumentResolver resolver = new HateoasPageableHandlerMethodArgumentResolver();
PagedResourcesAssembler<Account> accountPageAssembler = new PagedResourcesAssembler<Account>(resolver, null);
return new ResponseEntity<PagedResources<AccountResource>>(accountPageAssembler.toResource(resultPage, new AccountResourceAsm()), HttpStatus.OK);
}
@RequestMapping(method=RequestMethod.GET)
公共响应性有同样的问题,我想避免“手动”获取控制器中的PagedResourcesAssembler
将此添加到测试类为我修复了它:
@Import(HateoasAwareSpringDataWebConfiguration.class)
@RequestMapping(method=RequestMethod.GET)
public ResponseEntity<PagedResources<AccountResource>> getAccounts(
@RequestParam(value="name", required = false) String name,
@RequestParam(value="username", required = false) String username,
@RequestParam(value="email", required = false) String email,
@RequestParam(value="lastName", required = false) String lastName,
@RequestParam(value="size", required = true, defaultValue = "10") Integer size,
@RequestParam(value="page", required = true, defaultValue = "0") int page,
@RequestParam(value="sort", required = false, defaultValue = "username") String sort,
@RequestParam(value="direction", required = false, defaultValue = "asc") String direction,
UriComponentsBuilder uriBuilder,
HttpServletRequest request,
HttpServletResponse response) {
// Build page request
AccountList list = null;
Page<Account> resultPage = null;
Direction sortDirection = Direction.ASC;
if(direction.equals("desc")) {
sortDirection = Direction.DESC;
}
PageRequest pReq = new PageRequest(page, size, sortDirection, sort);
resultPage = accountService.findAll(pReq);
HateoasPageableHandlerMethodArgumentResolver resolver = new HateoasPageableHandlerMethodArgumentResolver();
PagedResourcesAssembler<Account> accountPageAssembler = new PagedResourcesAssembler<Account>(resolver, null);
return new ResponseEntity<PagedResources<AccountResource>>(accountPageAssembler.toResource(resultPage, new AccountResourceAsm()), HttpStatus.OK);
}
@Import(HateoasAwareSpringDataWebConfiguration.class)