如果我们想在一个类型上测试一个扩展函数,我们可以创建这个类型的一个实例,调用该函数并检查返回值。但是测试类中定义的扩展函数呢?

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/

    10-11 19:58
    查看更多