Kotlin: IllegalAccessException: класс BlockJUnit4ClassRunner не может получить доступ к члену класса Foo с модификаторами «private» - PullRequest
3 голосов
/ 05 апреля 2019

Используя Kotlin с Junit 4, я получаю следующее исключение для ввода поля параметра:

java.lang.IllegalAccessException: класс org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters не может получить доступ к члену класса MyTestClass с модификаторами «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)
    }
}

Есть идеи?

1 Ответ

0 голосов
/ 10 апреля 2019

Tl; dr: Добавление @ JvmField в оба поля решило проблему.Примерно так:

@JvmField
@Parameter
var input: Int = 0

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

Объяснение: По умолчанию Kotlin сделает поля приватными и сгенерирует методы получения / установки, как видно из декомпилированного кода Java ниже, в результате JUnit выигралне может прочитать приватные поля, поэтому появляется сообщение: не может получить доступ к члену класса MyTestClass с модификаторами "private"

@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;
}
...