我正在使用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'类型。
答案 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)
它应该工作