您如何在模块化 Java 项目中组织测试?

How do you organize tests in a modular Java project?

我正在 GitHub 上创建模块化构建(使用 module-info.java),但是当向我想要模块化的模块添加 module-info.java 时,没有测试可以被处决...

我怎样才能做到这一点?

我正在使用以下版本:

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

java.lang.reflect.InaccessibleObjectException: Unable to make com.github.jactor.rises.commons.dto.UserDtoTest() accessible: module jactor.rises.commons does not "opens com.github.jactor.rises.commons.dto" to unnamed module @65e98b1c

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

您想写哪种测试?

Extra-module tests: 创建一个仅测试项目(没有“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

例子

背景和其他资源

Maven Surefire 插件中有一个名为 useModulePath 的(新)选项。此选项允许使用传统的 Java 8 class 路径而不是模块路径,并忽略来自主要 classes 的 module-info.class 未打开 Java模块模式,即可以使用调用路径上的所有 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 中一样保留测试源。只有主要 classes 必须模块化。