我在这里找到了问题的部分答案:
https://blog.codefx.org/java/java-module-system-tutorial/#Open-Packages-And-Modules
-
Mockito使用反射从模块或类路径访问类。
-
Mockito位于“未命名模块”中,因为Maven将其添加到类路径而不是模块路径中。这就解释了为什么
opens package to org.mockito
从来都不管用:没有
org.mockito
单元
-
Maven Surefire不愿意为允许Mockito访问模块而“打开”模块。
-
莫基托(不再?)了能够
模拟非私人&非期末班
.无论如何,包保护类都是私有的。错误相当明确:Mockito创建了一个扩展包保护类的类,但现在失败了(它以前工作过,但这可能是因为Mockito在同一个包中创建了类,而不是在被模拟的包中创建的)。
尽管如此,这在应用程序中给出了一个有问题的配置
pom.xml
每个模块的:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>
--add-opens nodatafound.mockito_jpms_usecase/nodatafound.mjpmsuc=ALL-UNNAMED
</configuration>
</plugin>
我们需要明确地添加
打开一个未命名的模块
.这不应该在模块信息中完成。java,因为它将模块公开给
全部的
其他不利于封装的模块或罐子。
这是有问题的,因为:
-
您需要在pom中指定它。每个包的xml。
-
它增加了surefire配置的额外负担,我更喜欢简单的配置。
-
您没有来自IDE的验证;Eclipse将验证模块信息。java标记无效的包。
-
m2e不会向Eclipse JUnit插件传递必要的
<argLine />
使测试在Eclipse中失败。
maven方法(在Eclipse中也是如此,据我所知,可能还有Gradle)不允许为测试提供额外的模块信息;例如:让测试依赖性模块化(这可能是通过对每个源模块使用一个专用的测试模块来实现的,就像Eclipse对插件测试所做的那样)。