在我的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()。 任何帮助都会被贬低。
答案 0 :(得分:0)
peopleService
然后模拟方法peopleService.getPeopleSystems(pageable)
以返回Page
的模拟。
然后,您需要模拟方法people.getTotalElements()
和people.getSize()
以返回正确的值。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"));