我正在浏览Javalin github项目,并在kotlin测试功能下找到了
@Test
fun `ApiBuilder prefixes paths with slash`() = TestUtil.test { app, http ->
app.routes {
//code
}
assertThat(http.getBody("/level-1/hello"), `is`("Hello from level 1"))
}
TestUtil.test是一个静态方法,如下所示
public static void test(ThrowingBiConsumer<Javalin, HttpUtil> test) {
test(Javalin.create(), test);
}
我不了解Kotlin测试中的TestUtil.test {}代码块在做什么?是方法重载或方法扩展,还是调用静态方法?我是Kotlin的新手,所以尝试理解此代码。
答案 0 :(得分:4)
您猜到,这是一个静态方法调用。
其后的代码块是lambda,将其传递给函数。 (如果最后一个参数是lambda,则Kotlin允许您将其放在括号后-并且由于在这种情况下没有其他参数,因此您可以完全删除括号。在这种情况下可能看起来很混乱,但是可以帮助编写类似于语言语法的有用方法,对DSL来说非常有用。)
关于这种情况的另一个不同寻常的事情是被调用的方法是Java。 Java没有函数类型,但是通过具有“函数接口”(具有单个抽象方法的接口)来解决它;然后,lambdas实现该方法。 Kotlin在调用Java时会执行相同的操作,因此您发布的代码将调用TestUtil.test()并将其传递给ThrowingBiConsumer接口的实例。用花括号中的代码实现相关方法的实例。