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)
请尝试这个。这就是我从 gradle 将 JVM 参数传递给我的测试的方法,它起作用了。
test {
jvmArgs '-Dillegal-access=deny'
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1422 次 |
| 最近记录: |