如何访问抽象类内部类的扩展方法以编写单元测试?
解决Kotlin抽象类中成员扩展函数的单元测试访问问题
你遇到的核心问题是:InClass.b2()是AbstractClass的成员扩展函数,它的调用需要同时满足两个条件:拥有InClass的实例,以及关联AbstractClass的实例(因为它是AbstractClass的protected成员)。以下是修正后的代码和说明:
步骤1:修正子类实现
补全RealClassForTests中对抽象方法的实现,并正确调用扩展函数:
private class RealClassForTests(name: String) : AbstractClass(name) { // 实现抽象方法a2 override fun a2(): String { return "Test1" } // 实现InClass的成员扩展函数b2 override fun InClass.b2(): String { return "Test2" } fun a22() = a2() fun b22(): String { // 1. 创建InClass的实例作为扩展函数的接收者 val inClassInstance = InClass() // 2. 通过当前子类实例(即AbstractClass实例)调用扩展函数 return this.inClassInstance.b2() } }
步骤2:修正测试类
测试类保持原有结构即可,现在可以正常调用b22()获取结果:
class RealClassTest { private val realClass = RealClassForTests("name") @Test fun a2() { val a2 = realClass.a22() assert(a2 == "Test1") } @Test fun b2() { val b2 = realClass.b22() assert(b2 == "Test2") } }
关键说明
protected abstract fun InClass.b2(): String是成员扩展函数,它不属于InClass本身,而是属于AbstractClass的实例,必须通过AbstractClass的实例来调用;- 扩展函数的接收者是
InClass的实例,所以必须先创建InClass对象,再通过AbstractClass实例关联调用; - 之前直接写
InClass.b2()的错误在于:既没有InClass的实例作为接收者,也没有关联AbstractClass的实例来访问这个protected成员。
内容的提问来源于stack exchange,提问作者Zzz Zzz
相关产品推荐
相关产品推荐

