您如何在模块化 Java 项目中组织测试?
How do you organize tests in a modular Java project?
我正在 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: 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
例子
进行中的蓝图https://github.com/sormuras/sandbox/tree/master/sors-modular-testing-blueprint
在 https://github.com/sormuras/junit-platform-maven-plugin/tree/master/src/it
以“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 必须模块化。
我正在 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: 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
例子
进行中的蓝图https://github.com/sormuras/sandbox/tree/master/sors-modular-testing-blueprint
在 https://github.com/sormuras/junit-platform-maven-plugin/tree/master/src/it
以“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 必须模块化。