2017-04-19 46 views
2

建立在我的春节,启动应用程序的标题单元测试,我增加了我的头控制器内:对内部控制

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

头包含这是内部控制得到了人们的数量。代码按预期工作,但不可测试。

测试类大致可能是这样的:在与NPE例外线

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

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

测试失败。

所以我的问题是如何使我的控制器可测试,或如何重构代码以摆脱在我的方法内创建新的HttpHeaders()。 任何帮助将被折衷。

+0

是否可以注入'HTTPHeader'作为Spring Bean而不是每次都创建一个新的对象?这样,你可以轻松地嘲笑它。 – user2004685

+0

看起来你的'@ Test'方法有一些错误:你正在嘲笑'when(people.getContent())'方法,但'people'是一个'List'。 'String.valueOf(people.getTotalElements())'也是一样。这段代码甚至不应该编译 –

+0

没有找到你在哪里设置'''peopleService'''模拟到被测试的控制器中,并提供'''peopleService.getPeopleSystems'调用的结果。 NPE在这里最有可能发生,因为'''getPeopleSystems'''返回null和''people(null).getTotalElements()'''' –

回答

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")); 
0
  1. 您需要模拟peopleService,然后模拟方法peopleService.getPeopleSystems(pageable)返回的Page模拟。 然后你需要模拟方法people.getTotalElements()people.getSize()返回适当的值。
  2. HttpHeaders headers = mock(HttpHeaders.class)这不应该工作,因为新的对象是在方法中创建的。