Jav*_*rSA 6 unit-testing kotlin extension-function kotlin-extension
如果我们想在类型上测试扩展函数,我们可以创建这种类型的实例,调用函数并检查返回的值.但是如何测试类中定义的扩展函数呢?
abstract class AbstractClass<T> {
fun doStuff(): T = "Hello".foo()
abstract fun String.foo(): T
}
class SubClass1: AbstractClass<Int>() {
override fun String.foo(): Int = 1
}
class SubClass2: AbstractClass<Boolean>() {
override fun String.foo(): Boolean = true
}
Run Code Online (Sandbox Code Playgroud)
我们如何测试方法的逻辑foo()中类SubClass1和SubClass2?它甚至可能吗?
我知道我可以改变设计来测试它.我有两种可能性:
不要使用扩展功能.¯\ _(ツ)_ /¯
abstract class AbstractClass<T> {
fun doStuff(): T = foo("Hello")
abstract fun foo(string: String): T
}
class SubClass1: AbstractClass<Int>() {
override fun foo(string: String): Int = 1
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以创建一个对象SubClass1,调用foo()并检查返回的值.
创建具有internal可见性的其他扩展功能,以便测试逻辑.
class SubClass1: AbstractClass<Int>() {
override fun String.foo(): Int = internalFoo()
}
internal fun String.internalFoo(): Int = 1
Run Code Online (Sandbox Code Playgroud)
然后我们可以创建一个对象String,调用internalFoo()并检查返回的值.但是,我不喜欢这个解决方案,因为我们可以改变身体,override fun String.foo(): Int我们的测试会通过.
那么,是否可以在类中测试扩展函数?如果没有,您将如何更改您的设计以测试其逻辑?
小智 8
由于测试应该从客户的角度编写,我不确定它是否是一个有效的测试.但我确实提出了一种方法来测试它.
@Test
fun `test extension function`() {
var int = 0
SubClass1().apply {
int = "blah".foo()
}
assertThat(int, `is`(1))
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
865 次 |
| 最近记录: |