I want to test class B:

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

class A {
    protected fun init() { } // will be called by internal logic
}

在Java中,在测试方法(test class is in the same package as test subject)中调用:b.init()是没有问题的,但在Kotlin编译器中,它抱怨:

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

@Test
fun `checks init`() {
    val b = B()
    b.init()
    // assert work done
}

Why isn't it working? How can this be workaround (I want to avoid making method public)?

推荐答案

由于Kotlin通过不允许包访问来降低protected的可见性(与Java相比),所以我能找到的最好的 Select 是解决反射问题(因为这是为了测试,我认为没有理由不这样做)

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

Kotlin相关问答推荐

如果启用了Flyway迁移,则不能具有配置属性';datources.default.架构-生成

为什么Kotlin有次构造函数和init块?

Kotlin 基于参数类型的返回类型推断

为什么会出现Kotlin.Unit错误以及如何修复它?

Kotlin 协程按顺序执行,但仅在生产机器上执行

Kotlin 中的密封和内部有什么区别?

我可以在 Kotlin 中使用接口类型作为构造函数参数吗

JavaFX - 你如何在 Kotlin 中使用 MapValueFactory?

关于 Kotlin 函数类型转换的问题

禁用 Android 12 默认启动画面

JobIntentService 被销毁,当应用程序被销毁时

如何通过反射使用 Kotlin 对象

作为 Kotlin 中的函数的结果,如何从 Firestore 数据库返回列表?

使用 clear() 删除 EncryptedSharedPreferences 不起作用

Jetpack Compose State:修改类属性

main函数和常规函数有什么区别?

Kotlin通过映射委托属性,如果映射中不存在,则抛出NoTouchElementException

大小写敏感性 Kotlin / ignoreCase

kotlin 委托有什么用?

Kotlin:在何时使用枚举