Kotlin:IllegalAccessException:类 BlockJUnit4ClassRunner 无法使用修饰符 “private” 访问类 Foo 的成员

标签 kotlin junit junit4

Kotlin 与 Junit 4 结合使用时,出现以下参数字段注入(inject)异常:

java.lang.IllegalAccessException: Class org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters can not access a member of class MyTestClass with modifiers "private"

代码如下:

@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)
    }
}

有什么想法吗?

最佳答案

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

@JvmField
@Parameter
var input: Int = 0

@JvmField
@Parameter(1)
var expected: Int = 0

说明:默认情况下,Kotlin 会将字段设为私有(private)并生成 getter/setter,从下面反编译的 java 代码可以看出,因此 JUnit 将无法读取私有(private)字段字段因此显示消息:无法使用修饰符“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;
}

关于Kotlin:IllegalAccessException:类 BlockJUnit4ClassRunner 无法使用修饰符 “private” 访问类 Foo 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55527070/

相关文章:

java - 如何排除junit.framework.TestCase被Bytebuddy的@Origin拦截

eclipse - 在 Eclipse 的 JUnit 运行器中使用 JUnit @Rule

java - 具有多个接受答案的 JUnit 测试

generics - 如何从 kotlin 中的枚举类和字符串获取原始类型的枚举值

kotlin - 如何在 kotlin 中创建自定义迭代器并添加到现有类中?

java - JUnit - 从 TestSuite 访问 TestResult

java - 可选类型的单元测试用例

class - 如何保存Kotlin枚举中的类型?

android - 如何将表示类对象的 RecyclerView 项与此类对象绑定(bind)? Kotlin

java - jUnit 测试的 Objects.equals