0

使用 Spring MVC 测试框架standaloneSetup 模式来测试异步方法调用,我得到不一致的结果。以下测试可以在我的 IDE 中通过,但在使用 ANT 运行时失败,但有时在使用 ANT 运行时会通过,或者在 IDE 中失败。第二次调用的内容将只返回空字符串,或者返回预期的响应。

如果我将 .andDo(print) 添加到第一个调用中,或者在 2 个 mockMvc.perform 调用之间添加一个 500 毫秒的睡眠,则测试将通过。

有没有其他人遇到过这个?

控制器路由

@RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public final Callable<ResponseEntity<List<Integer>>> getEntries(
        @RequestParam(value = "limit", defaultValue = "100") final int limit) {
    return new Callable<ResponseEntity<List<Integer>>>() {
        @Override
        public ResponseEntitcany<List<Integer>> call() {
            return new ResponseEntity<List<Integer>>(service.findTopEntries(limit), HttpStatus.OK);
        }
    };
}

测试

this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();

@Test
public void testJSONResponse() throws Exception {

    MvcResult mvcResult = this.mockMvc.perform(get(this.basePath)
            .accept(MediaType.APPLICATION_JSON))
            .andReturn();

    this.mockMvc.perform(asyncDispatch(mvcResult))
            .andExpect(status().isOk())
            .andExpect(content().string("[]"));
}
4

3 回答 3

3

你需要调用 asyncStarted

MvcResult mvcResult = this.mockMvc.perform(get(this.basePath)
        .accept(MediaType.APPLICATION_JSON)).andExpect(request().asyncStarted())
        .andReturn();

尽管这有时对我来说仍然会产生不一致的结果

于 2013-11-01T00:31:29.430 回答
2

它帮助我调用 dummy

mvcResult.getAsyncResult();

在检查结果之前。否则我得到响应 200 而不是 404。Spring 4.0.6。

        final MvcResult mvcResult = this.mockMvc.perform(get("/api/buildings/{id}", key.toString())
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(request().asyncStarted())
            .andReturn();
        mvcResult.getAsyncResult();

        this.mockMvc.perform(asyncDispatch(mvcResult))
            .andDo(print())
            .andExpect(status().isNotFound());
于 2014-08-20T11:40:19.333 回答
1

spring mvc 测试框架中存在已知错误,https://jira.springsource.org/browse/SPR-10838

试试 2.3.5-SNAPSHOT,好像已经修复了

于 2013-11-01T07:27:25.983 回答