将私有Java9模块的包暴露给JUnit的正确方法是什么?

时间:2018-03-14 18:38:08

标签: java gradle java-9

我有一个“可执行的”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

在我看来,即使没有警告,这看起来也很可怕。

我的问题:如何“打开”此测试包以避免警告和错误?

1 个答案:

答案 0 :(得分:2)

由于Gradle插件仍处于试验阶段(Java 9发布后6个月),它似乎仍然存在一些漏洞和缺失的功能。

但是这里是如何解决这个问题,而Gradle开发人员并没有改善这种情况。

将其添加到您的构建文件中:

test {
    doFirst {
        jvmArgs += [
                '--add-exports', "module/package=junit",
        ]
    }
}

其中module/package是您需要使JUnit可见的模块和包的名称。

这基本上等同于exports package to junit中的module-info.java子句,但没有将子句make到编译的jar中!

javac -help中未记录此选项,但您至少可以在Oracle JDK Docs中找到它,更全面地在JEP-261中找到...请参阅{{1} }。section。