首页 文章

测试在Spring中返回页面的@RestController

提问于
浏览
0

我有这个restcontroller返回分页项目:

@GetMapping("/api/items")
    public Page<Item> getPagedItems(Pageable pageable, @RequestParam(defaultValue="") String searchBy, 
            @RequestParam(defaultValue="") String searchValue) {
        Page<Item> pageItem;

        switch (searchBy) {
        case "name" :
            pageItem = itemRepository.findByNameStartingWith(searchValue, pageable);
            break;
        case "description" :
            pageItem = itemRepository.findByDescriptionStartingWith(searchValue, pageable);
            break;  
        default:
            pageItem = itemRepository.findAll(pageable);    
            break;
        }   
        return pageItem;    
    }

到目前为止,我的MvcTest看起来像这样:

@Test
    public void testGetItems() throws Exception{  
      Page<Item> itemPage = itemRepository.findAll(PageRequest.of(0, 20));

      given(itemRepository.findAll(PageRequest.of(0, 20))).willReturn(itemPage)
      this.mvc.perform(get("/api/items")
       .contentType(MediaType.APPLICATION_JSON))
       .andDo(print())
       .andExpect(status().isOk())
       .andExpect(jsonPath("$",hasSize(1)));
    }

我想要这个/ api / items请求的内容 . 它正在回归

java.lang.AssertionError:在org.springframework.test.util.JsonPathExpectationsHelper.assertValue(JsonPathExpectationsHelper.java)的org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:290)的JSON路径“$”处没有值:74)org.springframework.test.web.servlet.result.JsonPathResultMatchers.lambda $ value $ 0(JsonPathResultMatchers.java:87)org.springframework.test.web.servlet.MockMvc $ 1.andExpect(MockMvc.java:179 at at.refrocurement.ItemRestMvcTest.testGetItems(ItemRestMvcTest.java:60)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown)来自org.junit.runners.model.ReflectiveCallable.run的org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:50)的java.lang.reflect.Method.invoke(未知来源) (ReflectiveCallable.java:12)org.junit.runners.model.Framework在org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks)的org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)中的Method.invokeExplosively(FrameworkMethod.java:47) . java:73)org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83)at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)在org.jun上的org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) .runners.ParentRunner.runLeaf(ParentRunner.java:325)org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)org.springframework.test.context.junit4.SpringJUnit4ClassRunn er.runChild(SpringJUnit4ClassRunner.java:97)org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290)org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:71)org.junit .runners.ParentRunner.runChildren(ParentRunner.java:288)在org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58)org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:268)at at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)位于org.junit的org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) . runners.ParentRunner.run(ParentRunner.java:363)位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run的org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) JUnit4TestReference.java:86)org.eclipse.jdt.inter上的org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) nal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)位于org.eclipse.jdt.internal.junit的org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) . orm.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)中的runner.RemoteTestRunner.run(RemoteTestRunner.java:460)引起:java.lang.IllegalArgumentException:json不能为null或者在com.jayway.jsonpath.JonPath.JsonPath.read(com.jayway.jsonpath.JsonPath.read)上的com.jayway.jsonpath.internal.Utils.notEmpty(Utils.java:386)处于com.jayway.jsonpath.JsonPath.read(JsonPath.java:342) . java:329)at org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:287)... 35更多

我该怎么做才能使这项测试工作?什么似乎是问题?

如果它也有帮助我也使用Spring Security . 我用@WithMockUser(roles =“ADMIN”)注释了测试类 .

1 回答

  • 2

    当您返回 Page<Item> 作为响应时,响应JSON将类似于:

    {
      content: [
        {
          id: 1,
          name: "abc"
        },
        {
          id: 2,
          name: "xyz"
        }
      ],
      pageable: {
        sort: {
          sorted: false,
          unsorted: true
        },
        offset: 0,
        pageSize: 10,
        pageNumber: 0,
        paged: true,
        unpaged: false
      },
      last: true,
      totalPages: 1,
      totalElements: 2,
      size: 10,
      number: 0,
      first: true,
      numberOfElements: 2,
      sort: {
        sorted: false,
        unsorted: true
      }
    }
    

    所以,你的断言路径应该是 $.content ,如 .andExpect(jsonPath("$.content",hasSize(1)));

相关问题