【问题标题】:Spring and Unit Testing DeferredResultSpring 和单元测试 DeferredResult
【发布时间】:2017-10-25 08:00:13
【问题描述】:

我有这个 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&lt;&gt;。我只想在特定条件下返回响应(参见上面的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。任何澄清表示赞赏,谢谢!

【问题讨论】:

    标签: java spring junit mockmvc


    【解决方案1】:

    认为我有一些工作。在 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();
    

    似乎有效...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 2016-03-24
      • 2016-03-15
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多