You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问抽象类内部类的扩展方法以编写单元测试?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:59:57