将 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/