![](/img/trans.png)
[英]Spring MVC unit test for DeferredResult doesn't call timeout callback
[英]Spring and Unit Testing DeferredResult
我有这个REST控制器
@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;
}
它返回DeferredResult<>
。 我只想在特定条件下返回响应(请参见上面的if()
条件)。 最好的方法是什么? 我是否创建另一个线程并调用callback.setResult()
?
另一个问题是我该如何测试(使用MockMVC):
@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。 任何澄清表示赞赏,谢谢!
认为我有一些工作。 在REST控制器中,在if()
条件内:
new Thread(() -> callback.setResult(someResponse)).start();
然后进行单元测试,我在第二个perform()...
块中添加了andReturn()
:
MvcResult mvcResult2 = this.mockMvc.perform(asyncDispatch(mvcResult)).andExpect(MockMvcResultMatchers.status().isCreated())
.andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_XML)).andReturn();
String responseString = mvcResult2.getResponse().getContentAsString();
似乎可以工作...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.