gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:11:05 29 4
gpt4 key购买 nike

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 问题上找到:

新的 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com