在Kotlin中测试不能访问受保护的方法

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

为什么它不工作? 这怎么可能是解决方法(我想避免使方法公开)?

在Java中protected与Kotlin不一样。

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

在Kotlin中, protected意味着您只能在同一个类或其任何子类中访问它。 见见可见性修饰符 – Kotlin

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

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

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