[英]What is the right way to expose a private Java9 module's package to JUnit?
我有一個需要測試的“可執行” 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
我認為,即使沒有警告,這看起來也很可怕。
我的問題:如何僅為了避免警告和錯誤而“打開”此程序包進行測試?
由於Gradle插件仍處於試驗階段(Java 9發行6個月后),因此它似乎仍有一些錯誤和缺少的功能。
但是以下是在Gradle開發人員無法改善情況的同時解決問題的方法。
將此添加到您的構建文件:
test {
doFirst {
jvmArgs += [
'--add-exports', "module/package=junit",
]
}
}
其中module/package
是需要對JUnit可見的模塊和軟件包的名稱。
這基本上等效於在module-info.java
exports package to junit
子句,但無需將該子句放入已編譯的jar中!
javac -help
沒有記錄該選項,但是您至少可以在Oracle JDK Docs中找到它,在JEP-261中更全面地提到它...請參閱Breaking encapsulation
部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.