Java模块:Mockito 2.20.0的可访问性问题
我正在从Java8迁移到Java10,我正在运行我的测试,现在由于包保护类而失败。该构建在maven 3.5.4+Oracle JDK 10.0.2下运行:Java模块:Mockito 2.20.0的可访问性问题,java,mockito,maven-3,java-module,java-10,Java,Mockito,Maven 3,Java Module,Java 10,我正在从Java8迁移到Java10,我正在运行我的测试,现在由于包保护类而失败。该构建在maven 3.5.4+Oracle JDK 10.0.2下运行: maven编译器插件3.7.0+asm 6.2 maven surefire插件2.22.0+asm 6.2+junit 5.2.0 编译器/surefire都需要asm 6.2,因为这些插件使用的asm版本中存在错误 mockito core 2.20.0(但之前在Java8中使用了2.20.0) 日蚀光子R 这个项目可以在这里找到(
- maven编译器插件3.7.0+asm 6.2
- maven surefire插件2.22.0+asm 6.2+junit 5.2.0
- 编译器/surefire都需要asm 6.2,因为这些插件使用的asm版本中存在错误
- mockito core 2.20.0(但之前在Java8中使用了2.20.0)
- 日蚀光子R
- 类org.mockito.codegen.notexportedoptomicitoprotected$MockitoMock$117073031无法访问其超类nodatafound.mjpmsuc.withopens.notexportedoptomicitoprotected
- 类org.mockito.codegen.NotExportedNotOpenedPublic$MockitoMock$365628885(在未命名模块@0x3f07b12c中)无法访问类nodatafound.mjpmsuc.internal.NotExportedNotOpenedPublic(在模块nodatafound.mockito\u jpms\u用例中)因为模块nodatafound.mockito_jpms_usecase不会将nodatafound.mjpmsuc.internal导出到未命名模块@0x3f07b12c
[编辑]一个月后更新了插件/依赖项的版本,没有结果。我在这里找到了问题的部分答案:
- Mockito使用反射从模块或类路径访问类
- Mockito位于“未命名模块”中,因为Maven将其添加到类路径而不是模块路径中。这解释了为什么
永远不起作用:没有将包打开到org.mockito
模块org.mockito
- Maven Surefire并不关心为了允许Mockito访问模块而对模块的“打开”做出贡献
- 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>
org.apache.maven.plugins
maven surefire插件
--添加打开nodatafound.mockito_jpms_usecase/nodatafound.mjpmsuc=ALL-UNNAMED
我们需要显式地将opens添加到一个未命名的模块。这不应该在module-info.java中完成,因为它将模块暴露给所有其他模块或jar,这不利于封装
这是有问题的,因为:
- 您需要在pom.xml中为每个包指定它
- 它增加了surefire配置的额外负担,我更喜欢简单的配置
- 您没有来自IDE的验证;Eclipse将验证标记为无效包的module-info.java李>
- m2e不会将必要的
传递给Eclipse JUnit插件,从而使测试在Eclipse中失败