Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java模块:Mockito 2.20.0的可访问性问题_Java_Mockito_Maven 3_Java Module_Java 10 - Fatal编程技术网

Java模块:Mockito 2.20.0的可访问性问题

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 这个项目可以在这里找到(

我正在从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
这个项目可以在这里找到(它位于Eclipse论坛,因为我是为另一个问题而做的,这次是因为Eclipse在模块上有局部错误)

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

  • 包保护类
  • 公共类,但未导出、未打开
  • 公共类未导出,但已向Mockito打开
  • 未导出但对所有人开放的公共类
  • 包保护类未导出,但已打开到Mockito
  • 包保护类未导出,但已向所有人打开
  • 在Java8中,情况1、5和6是相同的(对包的访问受保护)。案例2、案例3和案例4是相同的(接触公众)

    测试失败,因为Mockito无法:

    • 类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实际上有一个自动模块名,但被视为未命名的模块,因为在一个大的“未命名模块”的类路径中找到了所有jar

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


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

    我在这里找到了问题的部分答案:

    • 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中失败
    maven方法(在Eclipse中也是如此,据我所知,可能还有Gradle)不允许为测试提供额外的模块信息;例如:让测试依赖性模块化(这可能是通过对每个源模块使用一个专用的测试模块来实现的,就像Eclipse对插件测试所做的那样)