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

Kam*_*ryn 6 unit-testing kotlin

我想测试B类:

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

class A {
    protected fun init() { } // will be called by internal logic
}
Run Code Online (Sandbox Code Playgroud)

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

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

@Test
fun `checks init`() {
    val b = B()
    b.init()
    // assert work done
}
Run Code Online (Sandbox Code Playgroud)

为什么不工作?如何解决此问题(我想避免将方法公开)?

D3x*_*ter 6

protected Java中的语言与Kotlin中的语言不同。

在Java中,同一包中的所有内容都可以访问protected方法。请参见在Java中,默认,公共,受保护和私有之间的区别

在Kotlin中,protected意味着您只能在同一类或任何子类中访问它。参见可见性修改器-Kotlin

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


Kam*_*ryn 6

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

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