将私有Java9模块的包暴露给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个月),它似乎仍然存在一些漏洞和缺失的function。
但是这里是如何解决这个问题,而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中找到它,更全面地在JEP-261中找到它…请参阅Breaking encapsulation
部分。
- java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkState(ZLjava / lang / String;),包含Selenium,gradle和ChromeDriver
- Android Studio不会从外部库自动完成XML中的值
- 为什么要将“智能”IDEA依赖范围“提供”而不是“编译”?
- 如何在Gradle中支持多种语言(Java和Scala)的多个项目?
- 使用Gradle for Java插件生成Java类
- 如何将本地.jar文件依赖项添加到远程存储库?
- 如何从命令行运行单个gradle任务
- Android Studio Gradle:执行静态Java方法(从ANT迁移到Gradle)
- 使用详细类加载运行Gradle?