spring-test MockMvc kotlin DSL 缺乏异步支持?

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 会立即支持这一点。

Séb*_*uze 5

从 Spring Framework 5.2.2 和 Spring Boot 2.2.2 开始将支持此功能,语法如下:

mockMvc.get("/async").asyncDispatch().andExpect {
    status { isOk }
}
Run Code Online (Sandbox Code Playgroud)

请参阅相关问题了解更多详细信息。