我想测试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 }
为什么不工作?如何解决此问题(我想避免将方法公开)?
protected
Java中的语言与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) }