将私有 Java9 模块的包公开给 JUnit 的正确方法是什么?
What is the right way to expose a private Java9 module's package to JUnit?
我有一个 "executable" Java 9 模块(意味着它不会暴露任何包,它只包含一个 main
函数)我需要测试它。
我正在使用 Gradle 的 java-library
和 org.gradle.java.experimental-jigsaw
插件。
我有一些需要测试的包私有方法,当我在 IntelliJ 中 运行 时,测试有效,但是当 运行 Gradle 时,我得到很多这样的错误:
abc.MyClassTest > myTestMethod FAILED
java.lang.IllegalAccessException
在 Gradle 报告中,我看到了错误的根源:
class org.junit.runners.BlockJUnit4ClassRunner (in module junit)
cannot access class abc.MyClassTest (in module com.my.mod)
because module com.my.mod does not export abc to module junit
如果我将它添加到我的 module-info.java
文件中,它会出现警告:
exports abc to junit; // I don't really want to export this
警告(编译时):
warning: [module] module not found: junit
在我看来,即使没有警告,这看起来也很糟糕。
我的问题:如何"open"这个包只用于测试以避免警告和错误?
由于 Gradle 插件仍处于实验阶段(Java 9 发布后 6 个月),它似乎仍然存在一些错误和缺失的功能。
但这是在 Gradle 开发人员没有改善情况的情况下解决问题的方法。
将此添加到您的构建文件中:
test {
doFirst {
jvmArgs += [
'--add-exports', "module/package=junit",
]
}
}
其中 module/package
是您需要让 JUnit 可见的模块和包的名称。
这基本上等同于 module-info.java
中的 exports package to junit
子句,但没有将子句 make 到编译的 jar 中!
此选项未记录在 javac -help
中,但您至少可以在 Oracle JDK Docs and, more thoroughly, in JEP-261 中找到它...请参阅 Breaking encapsulation
部分。
我有一个 "executable" Java 9 模块(意味着它不会暴露任何包,它只包含一个 main
函数)我需要测试它。
我正在使用 Gradle 的 java-library
和 org.gradle.java.experimental-jigsaw
插件。
我有一些需要测试的包私有方法,当我在 IntelliJ 中 运行 时,测试有效,但是当 运行 Gradle 时,我得到很多这样的错误:
abc.MyClassTest > myTestMethod FAILED
java.lang.IllegalAccessException
在 Gradle 报告中,我看到了错误的根源:
class org.junit.runners.BlockJUnit4ClassRunner (in module junit)
cannot access class abc.MyClassTest (in module com.my.mod)
because module com.my.mod does not export abc to module junit
如果我将它添加到我的 module-info.java
文件中,它会出现警告:
exports abc to junit; // I don't really want to export this
警告(编译时):
warning: [module] module not found: junit
在我看来,即使没有警告,这看起来也很糟糕。
我的问题:如何"open"这个包只用于测试以避免警告和错误?
由于 Gradle 插件仍处于实验阶段(Java 9 发布后 6 个月),它似乎仍然存在一些错误和缺失的功能。
但这是在 Gradle 开发人员没有改善情况的情况下解决问题的方法。
将此添加到您的构建文件中:
test {
doFirst {
jvmArgs += [
'--add-exports', "module/package=junit",
]
}
}
其中 module/package
是您需要让 JUnit 可见的模块和包的名称。
这基本上等同于 module-info.java
中的 exports package to junit
子句,但没有将子句 make 到编译的 jar 中!
此选项未记录在 javac -help
中,但您至少可以在 Oracle JDK Docs and, more thoroughly, in JEP-261 中找到它...请参阅 Breaking encapsulation
部分。