在控制器内创建的标头的单元测试

时间:2017-04-19 05:56:01

标签: java spring unit-testing controller

在我的Spring Boot应用程序中,我在控制器中添加了一个标题:

@RequestMapping(value = "/people", method = RequestMethod.GET)
public ResponseEntity<List<Person>> systems(Pageable pageable) {
    Page people = peopleService.getPeopleSystems(pageable);
    HttpHeaders headers = new HttpHeaders();
    headers.add("CustomHeader1", String.valueOf(people.getTotalElements()));
    headers.add("CustomHeader2", String.valueOf(people.getSize()));
    return new ResponseEntity<List<People>>(people.getContent(), headers, HttpStatus.OK);
}

标题包含在控制器内获得的人数。 代码按预期工作,但不可测试。

测试类大致可能是这样的:

       @Test
public void test_header() throws Exception {

    PeopleService pepleService = mock(PeopleService.class);
    Pageable pageable = mock(Pageable.class);
    Page<Person> page = mock(Page.class);

    when(pepleService.getPeopleSystems(pageable)).thenReturn(page);
    when(page.getTotalElements()).thenReturn((long) 2000);
    when(page.getSize()).thenReturn(10);

    mockMvc.perform(get("/people")
            .accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(header().stringValues("CustomHeader1"));
}

测试失败

headers.add("CustomHeader1", String.valueOf(people.getTotalElements()));

NPE例外。

所以我的问题是如何让我的控制器可测试,或者如何重构代码以摆脱在我的方法中创建新的HttpHeaders()。 任何帮助都会被贬低。

2 个答案:

答案 0 :(得分:0)

  1. 您需要模拟peopleService然后模拟方法peopleService.getPeopleSystems(pageable)以返回Page的模拟。 然后,您需要模拟方法people.getTotalElements()people.getSize()以返回正确的值。
  2. HttpHeaders headers = mock(HttpHeaders.class)这不应该起作用,因为在方法中创建了新对象。

答案 1 :(得分:0)

原来我所需要的只是表明该类是Pagable.class的实例。这是工作测试:

   Page<Person> page = new PageImpl<>(new ArrayList<>());
   when(pepleService.getPeopleSystems(any(Pageable.class))).thenReturn(page);
   mockMvc.perform(get("/people")
            .accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(header().string("CustomHeader1", "2000"));