Kotlin:IllegalAccessException:Class BlockJUnit4ClassRunner 无法访问带有修饰符“private”的类 Foo 的成员

Pet*_*ile 6 junit junit4 kotlin

在 Junit 4 中使用Kotlin时,参数字段注入出现以下异常:

java.lang.IllegalAccessException: Class org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters 无法访问带有修饰符“private”的 MyTestClass 类的成员

这是代码:

@RunWith(Parameterized::class)
class MyTestClass {

    @Rule
    @JvmField
    val mockitoRule: MockitoRule = MockitoJUnit.rule()

    companion object {

    @Parameters(name = "{0}")
    @JvmStatic
    fun testData() = listOf(
            arrayOf(1, 1),
            arrayOf(2, 2),
            arrayOf(3, 3)
        )
    }

    @Parameter
    var input: Int = 0 // Public

    @Parameter(1)
    var expected: Int = 0 // Public

    @Test
    fun foo() {
        assertEquals(expected, input)
    }
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Pet*_*ile 5

Tl;dr:将@JvmField添加到两个字段解决了问题。就像这样:

@JvmField
@Parameter
var input: Int = 0

@JvmField
@Parameter(1)
var expected: Int = 0
Run Code Online (Sandbox Code Playgroud)

说明:默认情况下,Kotlin 会将字段设为私有并生成 getter/setter,如下面反编译的 java 代码所示,因此 JUnit 将无法读取私有字段,因此会出现消息:can not access a member带有修饰符“private”的 MyTestClass 类

@Parameter
private int input;

@Parameter(1)
private int expected;

public final int getInput() {
    return this.input;
}

public final void setInput(int var1) {
    this.input = var1;
}

public final int getExpected() {
    return this.expected;
}

public final void setExpected(int var1) {
    this.expected = var1;
}
Run Code Online (Sandbox Code Playgroud)