spring-test 添加了对 MockMvc DSL 的支持,可以在此处找到文档: https://docs.spring.io/spring/docs/5.2.0.M1/spring-framework-reference/languages.html#mockmvc-dsl
当测试返回 CompletableFuture(或任何其他异步结果类型)的 Controller 时,使用 MockMvc 的测试需要在主体可以断言之前执行 MvcResult 的 asyncDispatch。 这可以在各种博客或 stackoverflow 问题上找到:
- https://sdqali.in/blog/2015/11/24/testing-async-responses-using-mockmvc/
- MockMVC perform post test to async service
新的 DSL 似乎缺乏一种干净的方法来做到这一点。
例如,执行 asyncDispatch 需要以下代码:
@Test
internal fun call() {
val mvcResult = mockMvc.get("/execute") {
accept = APPLICATION_JSON
}.andExpect {
request { asyncStarted() }
}.andReturn()
mockMvc.perform(asyncDispatch(mvcResult))
.andExpect(MockMvcResultMatchers.status().isOk)
.andExpect(MockMvcResultMatchers.jsonPath("$.value", Is.`is`("test")))
}
我是否遗漏了一些可以启用此功能的东西,或者 DSL(目前)还没有很好地支持它?
更新: 我尝试通过 ResultActionsDsl 上的扩展功能改进这一点。
fun ResultActionsDsl.asyncDispatch(mockMvc: MockMvc):ResultActionsDsl {
val mvcResult = andReturn()
mockMvc.perform(MockMvcRequestBuilders.asyncDispatch(mvcResult))
return this
}
这使得可以将测试编写为:
@Test
internal fun call() {
mockMvc.get("/execute") {
accept = APPLICATION_JSON
}.andExpect {
request {
asyncStarted()
}
}
.asyncDispatch(mockMvc)
.andExpect {
status { isOk }
jsonPath("$.value") { value("test") }
}
}
我仍然觉得 DSL 开箱即用地支持它。
最佳答案
这将从 Spring Framework 5.2.2 和 Spring Boot 2.2.2 开始支持,语法如下:
mockMvc.get("/async").asyncDispatch().andExpect {
status { isOk }
}
参见 related issue了解更多详情。
关于spring-test MockMvc kotlin DSL 缺乏异步支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55923644/