【问题标题】:How do you organize tests in a modular Java project?如何在模块化 Java 项目中组织测试?
【发布时间】:2019-02-06 03:58:45
【问题描述】:

我正在GitHub 上创建一个模块化构建(使用 module-info.java),但是当将 module-info.java 添加到我想要模块化的模块时,无法执行任何测试...

我怎样才能做到这一点?

我正在使用以下版本:

  • junit.jupiter 版本 5.3.0(第一次使用版本 5.2.0 也不成功)
  • maven-compiler-plugin 版本 3.8.0(第一次使用版本 3.7.0 也不成功)
  • maven-surefire-plugin 版本 2.22.0(第一次使用版本 2.21.0 也不成功)

失败测试的典型错误如下所示:

java.lang.reflect.InaccessibleObjectException: 无法使 com.github.jactor.rises.commons.dto.UserDtoTest() 可访问:模块 jactor.rises.commons 不会“打开 com.github.jctor.rises.commons.dto" 到未命名的模块 @65e98b1c

【问题讨论】:

    标签: java maven java-9 junit5 java-platform-module-system


    【解决方案1】:

    欢迎来到 在模块化世界中测试

    您要编写哪种测试?

    额外模块测试:创建一个仅测试项目(没有“src/main”目录)并声明一个“src/test/java/module-info.java”模块描述符。

    模块内测试:从第 1 天开始,您需要将您的测试类“融入”/merge/shadow 到您的主类中,反之亦然。这里主要有两种方法可以实现:

    • 在测试运行时“编译模块化主要源代码”和“修补纯测试源代码”以及一些额外的“JVM 选项破解模块系统”来执行测试。
    • “编译模块化测试源”和“修补模块化主要源”在编译时执行测试。

    博客

    https://sormuras.github.io/blog/2018-09-11-testing-in-the-modular-world

    示例

    背景和其他资源

    【讨论】:

    • 这是超级超级级别的描述。我很确定这些例子在未来几天会有很好的点击率。感谢您提供与这些示例协作的答案。
    • 这有点“高级”编码,需要集中精力才能实现。我正在尝试在 java 的模块化世界中获得经验,但这很难实现,因为没有特别有用的示例和很少有用的文档......你能提供一些“逐步”的说明吗?我需要完全删除我的surefire插件吗?
    • 从我正在阅读的内容来看,在我看来,maven生命周期需要调整,首先是测试编译(将测试类和主类编译到同一个模块中)并测试它,然后如果它是成功的,它构建了没有测试类的模块。黑盒/白盒?考虑太多?我想测试我模块中的所有类(不仅是导出的类)...
    • @Sormuras 我只想用 JUnit 和 Maven 为一个极其简单的模块化库运行单元测试,一个模块导出一个包,除了 JUnit 和 AssertJ(测试范围)之外的零依赖。适用于 JUnit Jupiter 5.1.1、JUnit Platform 1.1.1 和 Maven Surefire 2.19.1。但是与 JUnit Jupiter 5.3.0 和 Maven Surefire 2.22.0 的 @jactor-rises 相同的错误。 Surefire 选项 --illegal-access=permit 没有帮助。我真的需要你的de.sormurasjunit-platform-maven-plugin吗?
    • Eclipse 也很困惑。很抱歉,标准工具不支持这种方法。
    【解决方案2】:

    Maven Surefire 插件中有一个(新)选项,名为 useModulePath。此选项允许使用传统的 Java 8 类路径而不是模块路径,并忽略未打开 Java 模块模式的主类中的 module-info.class,即可以使用调用路径上的所有类。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M5</version>
        <configuration>
            <!--  allow to use unnamed modules -->
            <useModulePath>false</useModulePath>
        </configuration>
    </plugin>
    

    这样测试源就可以像在 Java 8 中一样保留。只有主类必须模块化。

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      相关资源
      最近更新 更多