2017-10-25 12 views
0

나는이 REST 컨트롤러 그것은 DeferredResult<> 반환봄과 단위 테스트 DeferredResult

@RequestMapping(path = "/hello", method = RequestMethod.POST) 
@ResponseStatus(HttpStatus.CREATED) 
@ApiOperation(code = CREATED, value = "Blah", response = SomeResponse.class) 
@ApiResponses(value = { 
     @ApiResponse(code = CREATED, message = "blah") 
}) 
public DeferredResult<SomeResponse> hello(@RequestBody final SomeRequest req) { 

    DeferredResult<SomeResponse> callback = new DeferredResult<>(); 
    if (req.someProperty.equals("notimportant")) { 
     // return a new SomeResponse obj 
     SomeResponse sr = new SomeResponse(); 
     sr.setOneThing("whocares"); 
     sr.andAnother("snore"); 

     //...? 
    } else { 
     // does something asynchronously 
     someService.doSomething(req, callback::setResult); 
    } 
    return callback; 
} 

있습니다. 특정 조건에서 응답을 반환하고 싶습니다 (위의 if() 참조). 이것에 대해 가장 좋은 방법은 무엇입니까? 다른 스레드를 만들고 callback.setResult()으로 전화합니까?

@Test 
public void testWhatever() throws Exception { 
    SomeRequest request = createRequest(); 
    String requestContent = this.xmlObjectMapper.writeValueAsString(request); 

    MvcResult mvcResult = this.mockMvc.perform(MockMvcRequestBuilders.post("/api/hello") 
      .contentType(MediaType.APPLICATION_XML).content(requestContent).accept(MediaType.APPLICATION_XML)) 
      .andReturn(); 

    this.mockMvc.perform(asyncDispatch(mvcResult)).andExpect(MockMvcResultMatchers.status().isCreated()) 
      .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_XML)); 

    String responseString = mvcResult.getResponse().getContentAsString(); 
    SomeResponse resp = this.xmlObjectMapper.readValue(responseString,SomeResponse.class); 

    Assert.assertNotNull(resp); 
    // more assertions... 
} 

이 아무것도 안하고있다가하는 NPE를 받고 :

또 다른 질문은 내가 (MockMVC 사용)을 테스트하는 방법입니다. 모든 설명 감사, 감사!

답변

0

나는 뭔가 효과가 있다고 생각합니다. 나머지 제어기에서 if() 조건 안에 ...

MvcResult mvcResult2 = this.mockMvc.perform(asyncDispatch(mvcResult)).andExpect(MockMvcResultMatchers.status().isCreated()) 
    .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_XML)).andReturn(); 

String responseString = mvcResult2.getResponse().getContentAsString(); 

가 작동하는 것으로 보인다 :

new Thread(() -> callback.setResult(someResponse)).start(); 

상기 단위 테스트, I는 상기 제 perform()... 블록에 andReturn() 추가