当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Kotlin中进行测试无法访问受保护的方法》经验,为你挑选了2个好方法。

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

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



1> D3xter..:

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

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

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

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



2> Kamil Sewery..:

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

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

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有