我有这个 REST Controller
@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 Controller 中,if()
条件内:
new Thread(() -> callback.setResult(someResponse)).start();
在单元测试中,我向第二个 perform()...
block 添加了一个 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();
似乎有效...
关于java - Spring 和单元测试 DeferredResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46927012/