【问题标题】:Test in Kotlin cannot access protected methodKotlin 中的测试无法访问受保护的方法
【发布时间】:2017-05-30 12:16:15
【问题描述】:

我要考B类:

class B : A {
    override fun init() {
        // do work here
    }
}

class A {
    protected fun init() { } // will be called by internal logic
}

在 Java 中调用:b.init() 在测试方法中没有问题(测试类与测试对象在同一个包中),但在 Kotlin 编译器中会报错:

无法访问“init”:它在“B”中受到保护

@Test
fun `checks init`() {
    val b = B()
    b.init()
    // assert work done
}

为什么它不起作用?如何解决这个问题(我想避免公开方法)?

【问题讨论】:

标签: unit-testing kotlin


【解决方案1】:

由于 Kotlin 通过不允许包访问来降低 protected 的可见性(与 Java 相比),我能找到的最佳选择是使用反射解决方法(因为这是为了测试,我认为没有理由不这样做)

private fun invokeHiddenMethod(name: String) {
    val method = sut.javaClass.getDeclaredMethod(name)
    method.isAccessible = true
    method.invoke(testSubject)
}

【讨论】:

    【解决方案2】:

    Java 中的protected 与 Kotlin 中的不同。

    在 Java 中,同一个包中的所有内容都可以访问 protected 方法。 见In Java, difference between default, public, protected, and private

    在 Kotlin 中,protected 表示您只能在同一类或其任何子类中访问它。见Visibility Modifiers - Kotlin

    唯一可能的方法是使用internal 修饰符并使该方法对同一模块中的测试可见。

    【讨论】:

    • A 类实际上是库的一部分,因此无法更改,当我尝试将 internal 放在被覆盖的方法上时,这是不允许的
    猜你喜欢
    • 2020-07-26
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2011-08-14
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多