返回 PagedResources 的单元测试 Spring MVC 控制器

2023-12-20

我正在使用 Spring Boot 1.4.1、Spring Data Jpa 和 Spring Data Test 构建一个应用程序。

我有以下控制器,我想用它返回分页帐户:

@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);
}

我的测试方法是:

@Test
public void getAccountsTest() throws Exception {
    String uri = uriBase + "/accounts";

    List<Account> list = new ArrayList<Account>();
    list.add(accountOne);
    list.add(accountTwo);

    Page<Account> returnPage = new PageImpl<Account>(list, new PageRequest(0,10), list.size());

    when(accountService.findAll(any(PageRequest.class))).thenReturn(returnPage);

    mockMvc.perform(get(uri))
            .andExpect(status().isOk())
            .andDo(print())
            .andExpect(content().contentType(TestUtil.APPLICATION_JSON_UTF8))
            .andExpect(jsonPath("$.accounts", hasSize(2)))
            .andExpect(jsonPath("$.accounts[*].username", 
                    hasItems(endsWith(accountOne.getUsername()), endsWith(accountTwo.getUsername()))))
            .andExpect(jsonPath("$.accounts[*].email", 
                    hasItems(endsWith(accountOne.getEmail()), endsWith(accountTwo.getEmail()))));
}

我的问题是,当我运行 JUnit 测试时,它会因错误而中断

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.domain.Pageable]: Specified class is an interface
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:99)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:142)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:80)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:155)
at de.campuz.platform.rest.controller.AccountControllerTestDoc.getAccountsTest(AccountControllerTestDoc.java:93)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.restdocs.JUnitRestDocumentation$1.evaluate(JUnitRestDocumentation.java:55)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

我将 @EnableSpringDataWebSupport 注释添加到我的 Web 配置中,但错误仍然存​​在。当按原样运行应用程序时,控制器工作得很好,我将获取分页帐户作为 JSON 响应。但我不知道如何测试我的控制器。

有谁知道如何解决这个特定问题或如何对通常返回分页内容的 Spring MVC 控制器进行单元测试?


我通过从 Controller 构造函数中删除 Pageable 可分页来解决这个问题,因为我无论如何都不需要它。然后 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>()

我深入研究了 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);
}

我使用 HateoasPageableHandlerMethodArgumentResolver 创建资源组装器,将页面转换为我想要返回的 PagedResource。

然后我终于可以成功运行控制器测试(如问题中所示)。

This answer https://stackoverflow.com/a/21362291/3139759对我帮助很大,感谢 Oliver Gierke 和 Patrick Cornelissen。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

返回 PagedResources 的单元测试 Spring MVC 控制器 的相关文章

随机推荐

  • 如何在部分视图中获取与父操作关联的 RouteData?

    在 PartialView 的操作中 我想知道与父操作关联的 RouteData 该部分视图是我的母版页模板的一部分 我希望它知道作为页面渲染的一部分调用的控制器和操作 在我的 PartialView 操作中 我检查RouteData Va
  • Oracle 11g - 插入多行的最有效方法

    我有一个应用程序在 WAN 上运行缓慢 我们认为原因是对表进行多次插入 我目前正在研究同时插入多行的更有效方法 我找到了这个方法 INSERT ALL INTO MULTI INSERT VAL 1 VAL 2 VALUES 100 20
  • 从 Windows 服务执行 Process.Start 时访问被拒绝

    我正在尝试以另一个用户的身份从服务运行一个进程 Process Start applicationPath params account SecureStringPassword 服务正在 本地系统 帐户下运行 The account参数是
  • SharedArrayBuffer 未定义

    我正在使用一个名为react canvas 从几天前开始 一直输出一条错误消息 p 标签应在网络浏览器 包括 Chrome 中显示画布的区域中 我在用nextjs 我附上package json below SharedArrayBuffe
  • 用于 Android 的 Google Place API 来查找城市

    我看过教程 tutorial https developers google com academy apis maps places autocomplete android 在 android i 中使用自动完成文本视图查找城市 我已经
  • 从requirements.txt安装PyTorch

    火炬文档说使用 pip install torch 1 4 0 cpu torchvision 0 5 0 cpu f https download pytorch org whl torch stable html 安装最新版本的 PyT
  • 流星会话替换?

    在最新的 Meteor 版本 版本 0 5 8 中 Session已从服务器端代码中删除 以前我用过Session储藏客户特定的服务器的变量 该功能的替代品是什么 案例示例 User One打开浏览器 User Two打开浏览器 一个调用服
  • 如何在odoo中弹出成功消息?

    我通过单击按钮发送邀请 在单击按钮并成功发送邀请后 会弹出邀请发送成功的消息 但问题是弹出消息的主标题是Odoo Server Error 那是因为我正在使用 raise osv except osv Success Invitation
  • SCNScene 和 SceneKit 编辑器的子类化

    我有带有相机设置的 SCNScene 子类 我想在所有子类中使用它 let scene01 TheSubclassScene let scene02 TheSubclassScene named art scnassets testScen
  • 点击交换课程

    我有一个包含 6 个项目的列表 这些项目位于全局 div navigationaence 中 现在我可以在单击时添加一个类 但现在它们会加起来 这意味着一旦我的六个项目被单击 它们最终都会成为当前代理类 我希望能够删除向单击的项目添加一个类
  • 在 Typescript 中使用 async/await 时未定义 __awaiter

    我在 Typescript 中有以下代码片段 nsp on connection async function socket await this emitInitialPackage nsp currentLine currentCell
  • 当 url 导致临时重定向 (http 302) 时,什么会被索引?

    我正在努力使我们的 很大程度上基于 AJAX 的 网站对搜索引擎更加友好 我们有一个系统 在设置会话变量以更改主页的行为后 某些网址会重定向到主页 这是使用 Controller Redirect 方法创建 ActionResult 来实现
  • 通过 Gremlin 计算大图中的节点/边数?

    通过 Gremlin 计算大图中的节点 边数的最简单且最有效的方法是什么 我发现最好的方法是使用 V 迭代器 gremlin gt g V gather it size 然而 对于大图来说 这不是一个可行的选择V 的文档 http grem
  • numpy 中的加权协方差矩阵

    我想计算协方差C of n的测量p数量 其中每个单独的数量测量都有自己的权重 也就是我的权重数组W与我的数量数组具有相同的形状Q n by p 当地人np cov 函数仅支持赋予各个测量值的权重 即长度向量n 我可以初始化一个p by p矩
  • EF core、Any 无法翻译,将在本地评估

    我有一个程序可以返回我需要的实体 ID 我决定创建此过程 因为应返回给最终用户的实体由相关实体过滤 但 EF Core 不支持相关实体过滤 然后我想使用这个 id 来获取我需要的实体及其相关实体 我正在使用Any operator In m
  • Cleave.js 电话 CA

    我正在尝试使用格式化电话号码字段Cleave js https nosir github io cleave js 它不起作用 但我似乎不明白为什么 我是这样开始的 import Cleave from cleave js var clea
  • 如何在android中的string.xml中添加多段落的长文本

    当我在之间添加许多段落时
  • 组播中的环回

    这个问题是关于在同一主机内发送和接收多播 同时将其发送到其他主机 即使经过几个小时的谷歌搜索 我仍然无法弄清楚多播数据报是如何在同一主机内路由的 下面是问题的详细描述 Linux 盒子 A 通过电缆连接到交换机 路由器 我们将交换机 路由器
  • PHP 转义用户输入的文件名

    我有一个用户可以上传文件的表单 我想将该文件命名为 id lastname firstname pdf 该名称是由用户输入的 我担心他们输入的内容中带有斜杠 否则 类似的事情 path dir filename可能会导致 path uplo
  • 返回 PagedResources 的单元测试 Spring MVC 控制器

    我正在使用 Spring Boot 1 4 1 Spring Data Jpa 和 Spring Data Test 构建一个应用程序 我有以下控制器 我想用它返回分页帐户 RequestMapping method RequestMeth