在一个模块化的Java项目中,你如何组织测试?

17
我正在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
2个回答

19

欢迎来到《模块化世界中的测试》!

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

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

内部模块化测试: 从第一天开始,您需要将测试类与主要类混合/合并/影子化,或者反之亦然。这里您主要有两种方法可以实现:

  • 在测试运行时“编译模块化主源代码”并“修补普通测试源代码”,使用一些额外的“JVM选项操纵模块系统”来执行测试。
  • 在编译时“编译模块化测试源代码”并“修补模块化主源代码”以执行测试。

博客

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

例子

背景和其他资源


2
这是超级详细的描述。我相信这些例子在未来几天内会有很好的CTR。感谢您提供这些例子并给出答案。 - Naman
从我所阅读的内容来看,似乎需要调整Maven生命周期。首先进行测试编译(将测试类和主类编译到同一模块中),然后进行测试,如果成功,则构建不包含测试类的模块。黑盒/白盒?考虑太多了吗?我想测试模块中的所有类(而不仅仅是导出的类)... - jactor-rises
@jactor-rises 请看一下这个蓝图:https://github.com/sormuras/sandbox/tree/master/sors-modular-testing-blueprint -- 它仍在进行中,但通过一个最小的运行示例概述了这些想法。 - Sormuras
1
@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.sormuras”“junit-platform-maven-plugin”吗? - gdejohn
1
Eclipse也感到困惑。很抱歉,标准工具不支持这种方法。 - billmill
显示剩余7条评论

2

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

<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中的状态,只需要对主要类进行模块化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接