WebFlux WebTestClient 和 Kotlin 的类型干扰问题



我正在使用Spring Webflux和Kotlin为新应用程序构建原型。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:类型推断失败:没有足够的信息来推断参数 T 在乐趣中是等于(p0:版本!(:T!请明确说明。

使用的方法具有以下签名:

<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"方法返回一个值,该值现在定义为"无"类型。

这现在已经在 Kotlin 端修复了,有关更多详细信息,请参阅此博客文章。需要一个带有 Kotlin 1.5.30 的标志,并且将是 Kotlin 1.6.0 的默认值。

我遇到了同样的问题。

看起来解决方案是使用扩展函数.expectBody<Version>()

请参考: https://github.com/spring-projects/spring-framework/issues/20251#issuecomment-453457296

因此,您可以将代码更改为:

import org.springframework.test.web.reactive.server.expectBody
......
response<Version>.expectBody().isEqualTo(version)

它应该工作

最新更新