Как передать «legal-access = deny» в аргументы JVM модульного теста, используя плагин Gradle java? - PullRequest
6 голосов
/ 16 января 2020

У меня есть тест, который корректно завершается с InaccessibleObjectException, когда я запускаю его с аргументами JVM --illegal-access=deny в Eclipse. Я хочу, чтобы он не работал так же, когда я запускаю gradle check.

Я попробовал решение из Как передать аргументы в JVM, которая запускает тесты с Gradle :

# build.gradle
apply plugin: 'java'

test {
  jvmArgs '--illegal-access=deny'

  # also tried
  # jvmArgs('--illegal-access', 'deny')
  # jvmArgs '-Dillegal-access=deny'
}

Тест пройден вместо сбоя. Я видел тесты, в которых говорилось, что они грязные, потому что jvmArgs изменился.

Вот тест JUnit, который не дает сбоя. Извините, у него нет настроенного «ExceptionException », но он выдает при запуске с --illegal-access=deny из Eclipse.

import static org.junit.Assert.fail;

import java.lang.reflect.Field;

import org.junit.Test;


public class IllegalAccessTest {
  @Test
  public void testIllegalAccess() throws NoSuchFieldException, SecurityException {
    Field libraries = ClassLoader.class.getDeclaredField("loadedLibraryNames");
    System.out.println("About to set accessible");
    libraries.setAccessible(true);
    fail("Should fail before getting here when run with --illegal-access=deny");
  }
}

Вывод этого теста при запуске с Gradle показывает, что -Dillegal-access=deny получает передается в Gradle, но тест не проходит:

Starting process 'Gradle Test Executor 33'. Working directory: xxx Command: /usr/java/jdk-11.0.4/bin/java -Dillegal-access=deny -Dorg.gradle.native=false -javaagent:xxx,jmx=false @/tmp/gradle-worker-classpath17509364376879385105txt -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -ea worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 33'
Successfully started process 'Gradle Test Executor 33'

x.y.z.IllegalAccessTest  > testIllegalAccessQS STANDARD_OUT
    About to set accessible

x.y.z.IllegalAccessTest  > testIllegalAccessQS FAILED
    java.lang.AssertionError: Should fail before getting here when run with --illegal-access=deny
        at org.junit.Assert.fail(Assert.java:88)
        at x.y.z.IllegalAccessTest.testIllegalAccessQS(IllegalAccessTest.java:36)

Сообщение об ошибке при запуске с Eclipse является правильным

java.lang.reflect.InaccessibleObjectException: Unable to make field private static final java.util.Set java.lang.ClassLoader.loadedLibraryNames accessible: module java.base does not "opens java.lang" to unnamed module @6b9651f3

Ответы [ 3 ]

3 голосов
/ 28 января 2020

Документация для Тестовых задач гласит: List<String> jvmArgs:

Дополнительные аргументы, используемые для запуска JVM для процесса. Не включает системные свойства и минимальный / максимальный размер кучи.

И нет ничего другого, что имело бы смысл - поэтому это может быть:

test.jvmArgs = ["--illegal-access=deny"]

Возможно с или без -- или -. Помните, что JUnit 5 может вести себя по-разному .

2 голосов
/ 29 января 2020

Как обсуждалось в комментариях к вопросу, минимальный воспроизводимый пример поможет отследить проблему. Учитывая, что не было возможности предоставить один, возможно, это поможет иметь минимальный пример, который работает .

Минимальный Рабочий Настройка

Это полная настройка (исключая файлы Gradle 5.6.2 Wrapper):

.
├── build.gradle
└── src
    └── test
        └── java
            └── IllegalAccessTest.java

build.gradle

plugins {
    id 'java'
}

repositories {
    jcenter()
}

dependencies {
    testImplementation 'junit:junit:4.10'
}

test {
    jvmArgs '--illegal-access=deny'
}

src/test/java/IllegalAccessTest.java

точно так же как указано в вопросе

Проверка работоспособности

Запуск ./gradlew test дает ожидаемое java.lang.reflect.InaccessibleObjectException в строке 13 из src/test/java/IllegalAccessTest.java:

> Task :test FAILED

IllegalAccessTest > testIllegalAccess FAILED
    java.lang.reflect.InaccessibleObjectException at IllegalAccessTest.java:13

1 test completed, 1 failed

FAILURE: Build failed with an exception.

У меня есть Использовал OpenJDK 11.0.5 в этом тесте.

Замечание о различных методах изменения аргументов JVM теста

Если следующее имеет значение (как предложено в в этом комментарии )

test.jvmArgs = ["--illegal-access=deny"]

по сравнению с

test.jvmArgs '--illegal-access=deny'

, возможно, вы установили аргументы JVM в нескольких местах, которые мешают друг другу. Первый заменяет все ранее установленные аргументы JVM только на --illegal-access=deny, а последний только добавляет параметр --illegal-access=deny.

2 голосов
/ 22 января 2020

Пожалуйста, попробуйте это. Вот как я передаю аргументы JVM в мои тесты из Gradle, и это работает.

test {
    jvmArgs '-Dillegal-access=deny'
}
...