我的项目是一个使用JavaFX 11的依赖于Gradle的JavaFX项目。该项目是使用Gradle项目的默认结构创建的。因此,在src下,它有"main“和"test",每个都由一个"java”和一个“资源”目录组成。
对于使用Jenkins设置CI管道,要求梯度测试以我的IDE (IntelliJ)迄今为止的方式运行所有测试。有趣的是,经过几个小时的努力,我还没能让它发挥作用。
下面的在IntelliJ运行配置中,它在.test包中测试"all In package",这很好(点击屏幕截图)是build.gradle文件的所有相关部分,请注意,为了简单起见,我忽略了所有不相关的部分。
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
}
test {
useJUnitPlatform()
}
application {
mainClassName = 'FP.EDM.main/edm.Main'
}
每当我运行gradlew test命令时,就会得到以下两个错误:
java.lang.RuntimeException: Unable to parse --add-opens <module>/<package>: FP.EDM.main/
Could not write standard input to Gradle Test Executor 1.
java.io.IOException: The pipe is being closed
at java.base/java.io.FileOutputStream.writeBytes(Native Method)
at java.base/java.io.FileOutputStream.write(FileOutputStream.java:354)
at java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
at java.base/java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142)
at org.gradle.process.internal.streams.ExecOutputHandleRunner.forwardContent(ExecOutputHandleRunner.java:67)
at org.gradle.process.internal.streams.ExecOutputHandleRunner.run(ExecOutputHandleRunner.java:52)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.base/java.lang.Thread.run(Thread.java:834)
我尝试过的另一种方法是使用useJUnit()命令而不是useJUnitPlatform()。乍一看,这似乎非常好,但是,当我使用它时,根本找不到测试。我的假设是,测试的默认模块没有正确设置。然而,我没有办法设置这个或没有提到这个在线任何地方。请让我知道你的想法:)
PS。我宁愿不降级到JUnit 4.x,因为这将要求我重写所有这些(工作)测试。
发布于 2019-11-14 10:33:52
好的,我解决了这个问题,我不太清楚到底是什么原因造成的,但这与模块-信息的主要和测试模块有关。我决定暂时移除这两种东西,而且它的运行方式是应该的。
编辑:经过几天的环顾,我终于弄明白了。添加一个module-info.java
封装了一个模块及其依赖项。因为这个项目是应用分级模块插件,所以我不建议使用同样的插件,因为它可能会导致问题,尽管我自己还没有尝试过。
那怎么走呢?有两种选择:
-Ignore模块-info.java>可以在build.gradle文件有关该解决方案的示例,请查看以下内容中完成
-Specify一个模块-info.test>这是应用某些依赖项的一种方法,我的方法如下所示:
--add-modules
org.junit.jupiter.api
--add-reads
FP.EDM.main=org.junit.jupiter.api
请记住:这个文件格式应该放在源代码的根目录中,我所有的测试文件都在根目录中,因为我没有让它在根中工作(尽管可能就是我)。
https://stackoverflow.com/questions/58839753
复制相似问题