如何使用 Gradle java 插件将“illegal-access=deny”传递给单元测试的 JVM 参数?

Nou*_*non 7 java junit gradle build.gradle gradle-plugin

我有一个测试,当我--illegal-access=deny在 Eclipse 中使用 JVM args 运行它时,该测试正确失败并显示 InaccessibleObjectException 。我希望它在运行时以同样的方式失败gradle check

我尝试了How to pass args to JVM 中的解决方案,它使用 Gradle 运行测试

# build.gradle
apply plugin: 'java'

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

  # also tried
  # jvmArgs('--illegal-access', 'deny')
  # jvmArgs '-Dillegal-access=deny'
}
Run Code Online (Sandbox Code Playgroud)

测试通过而不是失败。我确实看到测试说它们很脏,因为 jvmArgs 已更改。

这是失败的 JUnit 测试。抱歉,它没有设置“expectedException”,但是--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");
  }
}
Run Code Online (Sandbox Code Playgroud)

与 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)
Run Code Online (Sandbox Code Playgroud)

使用 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
Run Code Online (Sandbox Code Playgroud)

Jul*_*ian 2

请尝试这个。这就是我从 gradle 将 JVM 参数传递给我的测试的方法,它起作用了。

test {
    jvmArgs '-Dillegal-access=deny'
}
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚测试了这个,它似乎不起作用。OP 示例的失败消息仍然是“使用 --illegal-access=deny 运行时在到达此处之前应该失败”,即使从 Gradle 运行也是如此 (2认同)