繁体   English   中英

弹簧和单元测试DeferredResult

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM