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

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

我怎样才能做到这一点?

我使用以下版本:

  • junit.jupiter 版本 5.3.0(第一次拍摄 5.2.0 版本也不成功)
  • maven-compiler-plugin 版本 3.8.0 (第一次 take 在 3.7.0 版本中也不成功)
  • maven-surefire-plugin 版本 2.22.0 (第一次 take 在 2.21.0 版本中也不成功)

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

java.lang.reflect.InaccessibleObjectException: Unable to make com.github.jactor.rises.commons.dto.UserDtoTest() accessible: module jactor.rises.commons not “opens com.github.jactor.rises.commons.dto” 到未命名的模块@65e98b1c


答案 1

欢迎来到模块化世界的测试

您想编写哪种类型的测试?

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

模块内测试:从第一天开始,您需要将测试类“混合”/合并/隐藏到主类中,反之亦然。在这里,您主要有两种方法可以实现此目的:

  • 在测试运行时“编译模块化主源代码”和“补丁普通测试源代码”,并附加一些“JVM选项破解模块系统”来执行测试。
  • 在编译时“编译模块化测试源”和“修补模块化主源”以执行测试。

博客

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

例子

背景和其他资源


答案 2

Maven Surefire插件中有一个(新)选项,名为。此选项允许使用传统的 Java 8 类路径而不是模块路径,并忽略主类中未打开 Java 模块模式的 a,即可以使用调用路径上的所有类。useModulePathmodule-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 中那样保留。只有主类必须模块化。


推荐