簡體   English   中英

將私有Java9模塊的程序包公開給JUnit的正確方法是什么?

[英]What is the right way to expose a private Java9 module's package to JUnit?

我有一個需要測試的“可執行” Java 9模塊(意味着它不會公開任何包,它只包含一個main功能)。

我正在使用Gradle的java-libraryorg.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM