gpt4 book ai didi

java - Spring 和单元测试 DeferredResult

转载 作者:行者123 更新时间:2023-12-02 12:05:38 24 4
gpt4 key购买 nike

我有这个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com