gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:45:14 25 4
gpt4 key购买 nike

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

我正在使用 Gradle 的 java-libraryorg.gradle.java.experimental-jigsaw 插件。

我有一些需要测试的包私有(private)方法,当我在 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 子句,但没有将子句 make 到编译的 jar 中!

此选项未记录在 javac -help 中,但您至少可以在 Oracle JDK Docs 中找到它。并且,更彻底地,在 JEP-261 ...请参阅 Breaking encapsulation 部分。

关于java - 将私有(private) Java 9 模块包公开给 JUnit 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49285412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com