这是我的测试用例:
@Test
public void sampleTestCase(int parm1, int parm2, Integer expectedReturnedMessageCode, String expectedReturnedparm2, Integer expectedReturnedparm1) throws Exception {
MvcResult result = mockMvc
.perform( MockMvcRequestBuilders
.post("/sampleapi")
.content(asJsonString(new SampleRequestClass(parm1, parm2)))
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andDo(print())
.andReturn();
mockMvc.perform(asyncDispatch(result))
.andExpect(status().isOk())
.andDo(print())
.andExpect(jsonPath("message_code").value(expectedReturnedMessageCode))
.andExpect(jsonPath("data.parm1").value(expectedReturnedparm1))
.andExpect(jsonPath("data.parm2").value(expectedReturnedparm2));
}
这个“sampleapi”返回一个 DeferredResult 对象。当我运行这个测试用例时,我收到以下错误。
java.lang.IllegalStateException: The asyncDispatch CountDownLatch was not set by the TestDispatcherServlet.
at org.springframework.util.Assert.state(Assert.java:73)
at org.springframework.test.web.servlet.DefaultMvcResult.awaitAsyncDispatch(DefaultMvcResult.java:158)
at org.springframework.test.web.servlet.DefaultMvcResult.getAsyncResult(DefaultMvcResult.java:145)
at org.springframework.test.web.servlet.DefaultMvcResult.getAsyncResult(DefaultMvcResult.java:136)
at org.springframework.test.web.servlet.request.MockMvcRequestBuilders.asyncDispatch(MockMvcRequestBuilders.java:269)
我对springboot比较陌生,之前这个单元案例是使用@SpringBootTest编写的,这个案例运行成功,后来我发现我可以在不实际加载所有内容的情况下运行测试用例,所以我切换到@WebMvcTest。我修复了所有其他依赖项(@MockBean)。现在我真的坚持这一点。我对这个问题的理解是使用 mockmvc 时没有启动异步。如果有人能告诉我如何解决它会很棒,因为我被卡住了。