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)
为什么不工作?如何解决此问题(我想避免将方法公开)?
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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5312 次 |
| 最近记录: |