cod*_*tim 4 spring spring-mvc spring-test
spring-test 添加了对 MockMvc DSL 的支持,可以在此处找到文档: https ://docs.spring.io/spring/docs/5.2.0.M1/spring-framework-reference/languages.html#mockmvc-dsl
当测试返回 CompletableFuture(或任何其他异步结果类型)的控制器时,使用 MockMvc 的测试需要先执行 MvcResult 的 asyncDispatch,然后才能断言主体。这可以在各种博客或 stackoverflow 问题中找到:
新的 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")))
}
Run Code Online (Sandbox Code Playgroud)
我是否缺少一些可以实现此功能的东西,或者这只是 DSL 中尚未得到很好的支持?
更新: 我尝试使用 ResultActionsDsl 上的扩展功能来改进这一点。
fun ResultActionsDsl.asyncDispatch(mockMvc: MockMvc):ResultActionsDsl {
val mvcResult = andReturn()
mockMvc.perform(MockMvcRequestBuilders.asyncDispatch(mvcResult))
return this
}
Run Code Online (Sandbox Code Playgroud)
这使得可以将测试编写为:
@Test
internal fun call() {
mockMvc.get("/execute") {
accept = APPLICATION_JSON
}.andExpect {
request {
asyncStarted()
}
}
.asyncDispatch(mockMvc)
.andExpect {
status { isOk }
jsonPath("$.value") { value("test") }
}
}
Run Code Online (Sandbox Code Playgroud)
我仍然觉得 DSL 会立即支持这一点。
从 Spring Framework 5.2.2 和 Spring Boot 2.2.2 开始将支持此功能,语法如下:
mockMvc.get("/async").asyncDispatch().andExpect {
status { isOk }
}
Run Code Online (Sandbox Code Playgroud)
请参阅相关问题了解更多详细信息。
| 归档时间: |
|
| 查看次数: |
1917 次 |
| 最近记录: |