如果我们想在一个类型上测试一个扩展函数,我们可以创建这个类型的一个实例,调用该函数并检查返回值。但是测试类中定义的扩展函数呢?
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
的主体并且我们的测试会通过。 那么, 是否可以在 类中测试扩展函数?如果没有,您将如何更改设计以测试其逻辑?
最佳答案
由于应该从客户的角度编写测试,因此我不确定这将是有效的测试。但是我确实提出了一种测试方法。
@Test
fun `test extension function`() {
var int = 0
SubClass1().apply {
int = "blah".foo()
}
assertThat(int, `is`(1))
}
关于unit-testing - 测试类中的扩展函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50702478/