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

问题描述

--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'
}

测试通过而不是失败。我确实看到测试说它们很脏,因为 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");
  }
}

使用 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

标签: javagradlejunitbuild.gradlegradle-plugin

解决方案


测试任务的文档如下List<String> jvmArgs

用于为进程启动 JVM 的额外参数。不包括系统属性和最小/最大堆大小。

没有其他的东西,这是有道理的 - 因此这可能是:

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

可能有或没有--or -。请注意,JUnit 5 的行为可能有所不同


推荐阅读