在Kotlin中测试无法访问受保护的方法。

13

我想测试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
}

为什么它不起作用?有什么解决方法吗(我想避免将方法设置为公共方法)?


可能是可测试的辅助方法使用什么访问修饰符?的重复问题。 - JB Nizet
@JBNizet 在覆盖方法上更改可见性使用 internal 不可能,使用 public 也不太可接受 - 特别是因为我可以在 Java 中这样做。 - Kamil Seweryn
2个回答

12

类A实际上是库的一部分,因此无法更改。当我尝试在重写的方法上加上“internal”时,它是不允许的。 - Kamil Seweryn
@KamilSeweryn 如果你认为这些信息与你的问题相关(可以说是相关的,因为你提供的上下文基本上使这个答案无效),那么你应该将它添加到问题中;在SO上,评论本质上是短暂的(是的,我知道我来晚了6年:D)。 - spamove

10

由于 Kotlin 比 Java 减少了对 protected 的可见性,而不允许包访问,所以我找到的最好选项是使用反射进行解决(因为这是用于测试,我认为没有理由不这样做)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接