У меня есть тест, который корректно завершается с 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