如果我们想测试一个类型的扩展函数,我们可以创建一个该类型的实例,调用该函数并检查返回值。但是测试类内部定义的扩展函数呢?
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
}
我们如何测试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 }
然后我们可以创建一个对象
SubClass1
,调用foo()
并检查返回值。创建具有可见性的附加扩展函数
internal
只是为了测试逻辑。class SubClass1: AbstractClass<Int>() { override fun String.foo(): Int = internalFoo() } internal fun String.internalFoo(): Int = 1
然后我们可以创建一个对象
String
,调用internalFoo()
并检查返回值。但是,我不喜欢这种解决方案,因为我们可以更改的主体override fun String.foo(): Int
并且我们的测试会通过。
那么,是否可以在类中测试扩展功能?如果不是,您将如何更改您的设计以测试他们的逻辑?