如何测试Kotlin扩展函数?

29

有人能告诉我如何在Kotlin中对扩展函数进行单元测试吗?由于它们是静态解析的,所以应该将它们作为静态方法调用还是非静态方法调用进行测试?另外,由于这门语言与Java完全兼容,那么如何对Kotlin扩展函数进行Java单元测试呢?

1个回答

29

测试一个方法(无论是静态的还是非静态的),你需要像真实代码一样调用它,并检查它是否做了正确的事情。

例如,假设该扩展方法定义在文件com/foo/Bar.kt中:

fun String.lengthPlus1(): Int {
    return this.length + 1
}

如果你要编写 Kotlin 代码的测试,你通常会使用 Kotlin 编写

assertThat("foo".lengthPlus1()).isEqualTo(4);

如果你用Java编写它(但为什么要这样做?)

assertThat(BarKt.lengthPlus1("foo")).isEqualTo(4);

1
从来没有想过为Kotlin编写Java测试,那样是非常糟糕的想法 :) 这只是为了检查它的行为。但是,如果我想验证是否调用了该方法(例如使用Mockito),而不是检查返回值呢? - TheTechWolf
正如Java代码所示,扩展方法实际上是一个静态方法。Mockito无法模拟静态方法。 - JB Nizet
3
@TheTechWolf,你真的不应该关注检查你的扩展方法是否被调用,你只需要验证预期结果是否存在即可。如果你的扩展方法过于复杂并需要断言其调用,那么它可能应该被重构为一个更易于测试的类。当然,这一切取决于你的使用情况和扩展函数实际所做的事情,你的使用情况是什么? - Mitch Ware
3
如果这些扩展是在一个类内部,会怎么样? - Luís Soares
10
确切地说,我该如何测试在类中定义的扩展函数?这就是我搜索到这个问题的原因 - 而这里根本没有得到答案。很遗憾。测试顶层扩展函数很容易,甚至不值得提问和回答... - Zordid
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接