Тестирование @RestController, который возвращает страницу в Spring

У меня есть этот 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. Это возвращается

Что я могу сделать, чтобы этот тест заработал? В чем вроде проблемы?

Если это поможет, я также использую Spring Security. Я аннотировал тестовый класс с помощью @WithMockUser (roles = "ADMIN").

Когда вы возвращаете

    @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;    
    }   
в качестве ответа, ответ JSON будет примерно таким:


person Emilio Gumayagay    schedule 11.04.2018    source источник


Ответы (1)


Итак, ваш путь утверждения должен быть $ .content, например .andExpect(jsonPath("$.content",hasSize(1)));

{
  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
  }
}

Он по-прежнему возвращает java.lang.AssertionError: нет значения в пути JSON $ .content, хотя также мой MockHttServletRepose возвращает пустое тело с нулевым типом содержимого

person K. Siva Prasad Reddy    schedule 11.04.2018
comment
О, тогда это должно быть ошибка с настройкой Mock Data. Я вижу, вы вызываете Page ‹Item› itemPage = itemRepository.findAll (PageRequest.of (0, 20)); чтобы настроить фиктивный ответ. Можете ли вы проверить, является ли itemPage NULL? - person Emilio Gumayagay; 11.04.2018
comment
Предполагая, что я еще не вошел в систему, я получаю страницу входа (проверено с помощью браузера и почтальона), когда я вошел в систему, я получаю {content: [{id: 1, name: Update item, description: Update description}, {id: 2, name: Item 2, description: Description \ r \ n}], pageable: {sort: {sorted: false, unsorted: true}, смещение: 0, pageNumber: 0, pageSize: 20, paged: true , unpaged: false}, last: true, totalPages: 1, totalElements: 2, size: 20, number: 0, sort: {sorted: false, unsorted: true}, numberOfElements: 2, first: true} - person K. Siva Prasad Reddy; 11.04.2018
comment
Если это проблема с аутентификацией пользователя, вы можете использовать @WithMockUser (roles = ADMIN) в методе тестирования для имитации аутентифицированного запроса. - person Emilio Gumayagay; 11.04.2018
comment
Для использования @WithMockUser необходимо добавить зависимость maven org.springframework.security:spring-security-test. - person K. Siva Prasad Reddy; 11.04.2018
comment
Я уже аннотировал весь класс с помощью @WithMockUser (роли = ADMIN) - person K. Siva Prasad Reddy; 11.04.2018
comment
Давайте продолжим это обсуждение в чате. - person Emilio Gumayagay; 11.04.2018
comment
java.lang.AssertionError: нет значения в пути JSON "$" в org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath (JsonPathExpectationsHelper.java:290) в org.springframework.test.util.JsonPathjaspectations (JsonPathExpectations: 74) в org.springframework.test.web.servlet.result.JsonPathResultMatchers.lambda $ value $ 0 (JsonPathResultMatchers.java:87) в org.springframework.test.web.servlet.MockMvc $ 1.andExpect (MockMvc.java: в com.eprocurement.ItemRestMvcTest.testGetItems (ItemRestMvcTest.java:60) в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke (Неизвестный источник Impl. ) в java.lang.reflect.Method.invoke (Неизвестный источник) в org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.run ReflectiveCal lable.java:12) в org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:47) в org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java.spring:17) в .test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate (RunBeforeTestExecutionCallbacks.java:73) в org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallframe.Callbacks.context.context.RunAfterTestExecutionCallframe.Callbacks.conf.statements. .junit4.statements.RunBeforeTestMethodCallbacks.evaluate (RunBeforeTestMethodCallbacks.java:75) в org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate.frame.jpg .SpringRepeat.evaluate (SpringRepeat.java:84) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runCh ild (SpringJUnit4ClassRunner.java:251) на org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild (SpringJUnit4ClassRunner.java:97) на org.junit.runners.Pner90.java: junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) на org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) на org.junit.runners.ParentRunner.access $ 000 (Parent:58 ).java в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) в org.springframework.test.context.junit4.statements. RunBeforeTestClassCallbacks.evaluate (RunBeforeTestClassCallbacks.java:61) в org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate (RunAfterTestClassCallbacks. в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run (SpringJUnit4ClassRunner.java:190) в org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run (JUnitclass.jpg) или .internal.junit.runner.TestExecution.run (TestExecution.java:38) по адресу org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:538) по адресу org.eclipternal.jdit.in .runner.RemoteTestRunner.runTests (RemoteTestRunner.java:760) по адресу org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run (RemoteTestRunner.java:460) по адресу org.eclipse.jdtner.inestner.jdtner.inestner.jd .main (RemoteTestRunner.java:206) Вызвано: java.lang.IllegalArgumentE xception: json не может быть нулевым или пустым в com.jayway.jsonpath.internal.Utils.notEmpty (Utils.java:386) в com.jayway.jsonpath.JsonPath.read (JsonPath.java:342) в com.jayway. jsonpath.JsonPath.read (JsonPath.java:329) в org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath (JsonPathExpectationsHelper.java:287) ... еще 35 - person Emilio Gumayagay; 11.04.2018