2017-10-25 4 views
0

は、私はそれがDeferredResult<>を返し、このRESTコントローラ春とユニットテスト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

私は何かが働いていると思う。 RESTコントローラにおいて、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(); 

、ユニットテスト、私は第二perform()...ブロックにandReturn()を添加しました

関連する問題