java - Spring 和单元测试 DeferredResult

标签 java spring junit mockmvc

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

相关文章:

java - 捕获而不尝试错误

java - 它如何将一个对象字段数据复制到同一类的另一个对象?

java - Tomcat Apache Web 应用程序中的库出现异常,未找到 TLD

java - 在 Tomcat + spring web 应用程序中文件上传实际发生在什么阶段

java - 尝试部署到 tomcat 时,由 : java. lang.NoSuchFieldError: NULL 引起

java - 如何模拟正在测试的类的某些对象?

java - 不使用 Java/OpenJDK 创建 JAR 存档

excel - 错误 : Can' t connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable

android - 在 Junit for Android 中使用 FEST-assert 的正确方法?

java - 我可以强制 jetty *不*包含用于单元测试的 Content-Length header 吗?