如果我们想测试某个类型的扩展函数,我们可以创建该类型的实例,调用该函数并检查返回值。但是测试类内部定义的扩展函数又如何呢?
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
and 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
, call foo()
并检查返回值。
-
创建额外的扩展功能internal
可见性只是为了测试逻辑。
class SubClass1: AbstractClass<Int>() {
override fun String.foo(): Int = internalFoo()
}
internal fun String.internalFoo(): Int = 1
然后我们就可以创建一个对象了String
, call internalFoo()
并检查返回值。但是,我不喜欢这个解决方案,因为我们可以改变override fun String.foo(): Int
我们的测试就会通过。
So, 是否可以在类内测试扩展函数?如果没有,你将如何改变你的设计来测试他们的逻辑?
由于测试应该从客户的角度编写,因此我不确定这是否是一个有效的测试。但我确实想出了一种方法来测试它。
@Test
fun `test extension function`() {
var int = 0
SubClass1().apply {
int = "blah".foo()
}
assertThat(int, `is`(1))
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)