gpt4 book ai didi

Java模块: accessibility problems for Mockito 2. 20.0

转载 作者:行者123 更新时间:2023-12-02 11:10:52 24 4
gpt4 key购买 nike

我正在从 Java 8 迁移到 Java 10,并且正在运行测试,但由于包 protected 类,该测试现在失败了。构建在 maven 3.5.4 + Oracle JDK 10.0.2 下运行:

  • maven-compiler-plugin 3.7.0 + asm 6.2
  • maven-surefire-plugin 2.22.0 + asm 6.2 + junit 5.2.0
  • 编译器/surefire 都需要 asm 6.2,因为这些插件使用的 ASM 版本存在错误。
  • mockito-core 2.20.0(但之前在 Java 8 中使用过 2.20.0)。
  • Eclipse Photon R

该项目可以在这里找到 ide-bugs.zip (它位于 Eclipse 论坛,因为我为另一个问题制作了此 Topic on Eclipse,这次 Eclipse 的模块出现本地错误)。

测试非常简单:我们尝试模拟具有不同访问级别的不同类 - 所有这些都在 Java 8 中工作。

  1. 包保护类
  2. 公开课但未导出、未开放
  3. 公共(public)类未导出,但向 Mockito 开放
  4. 公开课不导出,但向所有人开放
  5. 包 protected 类未导出,但打开到 Mockito
  6. 包保护类未导出,但向所有人开放

在 Java 8 中,情况 1、5 和 6 是相同的(访问 protected 包)。情况2、3、4相同(公开访问)。

测试失败,因为 Mockito 无法:

  • 类 org.mockito.codegen.NotExportedOpenToMockitoProtected$MockitoMock$117073031 无法访问其父类(super class) nodatafound.mjpmsuc.withopens.NotExportedOpenToMockitoProtected
  • 类org.mockito.codegen.NotExportedNotOpenedPublic$MockitoMock$365628885(在未命名模块@0x3f07b12c中)无法访问类nodatafound.mjpmsuc.internal.NotExportedNotOpenedPublic(在模块nodatafound.mockito_jpms_usecase中),因为模块nodatafound.mockito_jpms_usecase不导出no数据发现.mjpmsuc。未命名模块内部@0x3f07b12c

Mockito 实际上有一个自动模块名称,但被视为未命名模块,因为在类路径中找到的所有 jar 都是一个大的“未命名模块”。

虽然我可以从受包保护迁移到非导出包,但我不明白如何解决使我的接口(interface)/类对其他模块不可见的问题?

[edit]一个月后更新了插件/依赖的版本,没有结果。

最佳答案

我在这里找到了问题的部分答案: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(不再?)能够模拟非私有(private)和非最终类。无论如何,包保护类都是私有(private)的。错误相当明显:Mockito 创建了一个扩展包 protected 类的类,但现在失败了(之前可以正常工作,但这可能是因为 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>

我们需要显式添加打开到未命名的模块。这不应该在 module-info.java 中完成,因为它将模块暴露给所有其他模块或 jar,这违反了封装。

这是有问题的,因为:

  • 您需要在每个包的 pom.xml 中指定它。
  • 它给我更喜欢简单的可靠配置增加了额外的负担。
  • 您没有获得 IDE 的验证; Eclipse 将验证 module-info.java 标记无效包。
  • m2e 不会将必要的信息传递给 Eclipse JUnit 插件 <argLine />导致 Eclipse 中的测试失败。

maven 方法(据我所知,在 Eclipse 和 Gradle 中是相同的)不允许为测试提供额外的模块信息;例如:让测试依赖性模块化(这可能可以使用每个源模块的专用测试模块来完成,就像 Eclipse 对插件测试所做的那样)。

关于Java模块: accessibility problems for Mockito 2. 20.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634322/

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