将私有 Java 9 模块包公开给 JUnit 的正确方法是什么?

2024-06-26

我有一个“可执行”Java 9 模块(意味着它不会公开任何包,它只包含一个main函数)我需要测试。

我正在使用 Gradle 的java-library and 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",
        ]
    }
}

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

这基本上相当于exports package to junit中的条款module-info.java,但没有将子句 make 放入编译的 jar 中!

该选项没有记录在javac -help,但你至少可以找到它在Oracle JDK 文档 https://docs.oracle.com/javase/9/tools/javac.htm#JSWOR627并且,更彻底地,在JEP-261 http://openjdk.java.net/jeps/261...参见Breaking encapsulation部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将私有 Java 9 模块包公开给 JUnit 的正确方法是什么? 的相关文章

随机推荐