我有一个测试,当我--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 …Run Code Online (Sandbox Code Playgroud) 此问题已在 Gradle 6.6 中修复
我想在测试中放置标志-XX:+ShowCodeDetailsInExceptionMessages以启用有用的 NPE ( https://openjdk.java.net/jeps/358 )
我试过
tasks.withType<Test> {
jvmArgs("-XX:+ShowCodeDetailsInExceptionMessages")
testLogging {
setExceptionFormat("full") // Prints the message of the exception
}
}
Run Code Online (Sandbox Code Playgroud)
但是 NPE 仍然没有消息。
这是我的java版本
java -version
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7)
OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
使用更多研究进行编辑
为了更准确地找出问题的根源,我做了更多的工作。我的结论是它不是来自我的 java 也不是测试框架,它只能是 gradle 的错误配置或错误。这是我所做的:
我已经用这个 build.gradle.kts 设置了一个空的 gradle 项目
plugins {
java
}
repositories {
mavenCentral()
}
dependencies {
testImplementation("junit:junit:4.13")
}
tasks.withType<Test> {
jvmArgs("-XX:+ShowCodeDetailsInExceptionMessages") // Helpful …Run Code Online (Sandbox Code Playgroud) 我想将 JVM 参数传递给我的 Gradle 测试任务。我使用 Cucumber 功能文件中的参数:${app.url}. 在build.gradle文件中,我放置了这些行:
test {
testLogging.showStandardStreams = true
systemProperties System.getProperties()
}
Run Code Online (Sandbox Code Playgroud)
当我执行时gradle test -Dapp.url=http://.....,我没有看到参数已传递给应用程序。我也尝试了以下方法,但结果是相同的:
test {
testLogging.showStandardStreams = true
systemProperty "app.url", System.getProperty("app.url")
}
Run Code Online (Sandbox Code Playgroud)
当我使用 Maven 并传递与 Jvm 参数相同的参数时,它工作得很好。现在我想切换到 Gradle,但我被传递参数所困扰。