使用WebFlux WebTestClient和Kotlin键入干扰问题

时间:2017-07-25 06:46:52

标签: kotlin type-inference spring-webflux

我正在使用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 in fun isEqualTo(p0:Version!):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'方法返回一个值,现在将其定义为'Nothing'类型。

2 个答案:

答案 0 :(得分:1)

这个已知问题来自于已经在Spring JIRA上报告为KT-5464的Kotlin类型推理限制(SPR-15692)已经在Spring Framework 5.0.6+ / Spring Boot 2.0.2+中得到修复。确保通过编写 <script> var d = new Date(); var utc_offset = d.getTimezoneOffset(); d.setMinutes(d.getMinutes() + utc_offset); var h = d.getHours(); var m = d.getMinutes(); var s = d.getSeconds(); function clockUpdater() { if(h >= 0 || h <= 5){ hl = h - 18; }else if(h >= 6 || h <= 11 ){ hl = h - 12; }else if(h >= 12 || h <= 17){ hl = h - 6; }else if(h >= 18){ hl = h - 0; } /* hl = hl - 1; if(m>1){ ml = 60 - m -1; } */ ml = 60 - m; sl = 60 - s; document.getElementById("timer").innerHTML = hl+":"+ml+":"+sl; } setInterval(clockUpdater, 1000); </script> <body> <div id="timer"></div> </body> 来使用Kotlin扩展。另见我创建的Kotlin中的the repository with concrete WebTestClient examples

答案 1 :(得分: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)

它应该工作