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

标签 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(或任何其他异步结果类型)的 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/

相关文章:

java - 如何在 Spring Boot 中模拟数据库连接以进行测试?

java - 返回硬编码值时,Spring Boot 单元测试不起作用

带时间戳返回间隔的 Java Spring/PgSQL 操作

java - 如何在 Spring Boot 项目上禁用 activiti 自动部署

java - 基于 Spring-security.xml 代码的配置

java - 使用 Hibernate 玩 Framework - 如何像 Spring 一样使用 DAO/Service/controller

添加到 JSON 响应的 Java JSON 反斜杠

java - Spring JPA 没有正在进行的事务

spring-mvc - 使用 spring 3.x 配置速度工具

java - Assertj 3.16.1 中是否弃用了方法 "hasOnlyElementsOfType"