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)
有任何想法吗?
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)
| 归档时间: |
|
| 查看次数: |
848 次 |
| 最近记录: |