kotlin - WebFlux WebTestClient 和 Kotlin 的类型干扰问题

标签 kotlin type-inference spring-webflux

我正在使用 Spring Webflux 和 Kotlin 为新应用程序构建原型(prototype)。 Spring Webflux 包含一个用于单元测试的 WebTestClient。根据文档,我应该能够像这样测试 REST 调用的结果:

@Test
fun getVersion_SingleResult_ContentTypeJson_StatusCodeOk_ContentEqualsVersion() {
    //given
    var version = Version("Test", "1.0")
    val handler = ApiHandler(version!!)
    val client = WebTestClient.bindToRouterFunction(ApiRoutes(handler).apiRouter()).build()

    //expect
    val response = client.get().uri("/api/version/").exchange()
    response.expectStatus().isOk
    response.expectHeader().contentType(MediaType.APPLICATION_JSON_UTF8)
    response.expectBody(Version::class.java).isEqualTo(version)
}

但是,我遇到了一些类型干扰问题。问题在于“expectBody”和“isEqualTo”的组合。

我得到的错误是:

Kotlin: Type inference failed: Not enough information to infer parameter T in fun isEqualTo(p0: Version!): T! Please specify it explicitly.



使用的方法具有以下签名:
<B> WebTestClient.BodySpec<B, ?> expectBody(Class<B> var1);

public interface BodySpec<B, S extends WebTestClient.BodySpec<B, S>> {
    <T extends S> T isEqualTo(B var1);
}

可悲的是,我遇到了泛型知识的限制以及 Kotlin 和 Java 之间的差异,这意味着我不确定我应该如何指定这一点。

编辑:就像我在下面说的,当我使用 isEqualTo<Nothing>(version) 时它会编译.但是,当 isEqualTo 结束而没有失败时,这会导致 NullPointerException。这似乎是因为 'isEqualTo' 方法返回一个值,该值现在定义为 'Nothing' 类型。

最佳答案

现在在 Kotlin 方面已修复此问题,请参阅 this blog post更多细节。 Kotlin 1.5.30 需要一个标志,这将是 Kotlin 1.6.0 的默认标志。

关于kotlin - WebFlux WebTestClient 和 Kotlin 的类型干扰问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45295818/

相关文章:

java - 在 TimeoutMainSubscriber 的情况下将 Reactor Context 复制到 MDC

java - Kotlin 1.4.30 Apache beam 编译错误

java - 如何不允许类型推断并要求方法调用时显式类型?

kotlin - 两个列表的所有可能组合

rust - Rust 的类型推断如何跨多个语句工作?

scala - Scala中的泛型类型推断

json - 使用 WebFlux 从资源中读取和解析文件的 react 方式?

java - Spring Webflux Security 允许除一个 URL 之外的所有 URL

android - 使用参数查询 ROOM 数据库后无法让 ViewModel 显示数据 (Kotlin)

kotlin - 一起运行时,测试会失败,但是单独运行会成功,即使在每次测试之前重新模拟实例