Maven 工程,单元测试工具类如何安放?
- Java
- 2018-12-07
- 110热度
- 0评论
导航
大型 maven 工程的项目中,有很多模块,每个模块有自己的 source 目录和 test 目录。
source 目录(src/main/java)存放功能代码,test 目录(src/test/java)存放本模块的单元测试代码。
假设我们现在有3个模块,moduleA、moduleB、baseModule。moduleA 和 moduleB 都依赖 baseModule。
问题来了,我想抽出一些通用的单元测试工具类,供所有模块的 test 使用,应该怎么办?
方案一:
模块间本身是有依赖的,我们把单元测试工具类放到 baseModule 的 test 目录下即可。
点评:
否决。当我们用 maven 管理项目时,功能代码(src)和测试代码(test)的编译输出路径不同,模块间依赖只能依赖到功能代码,导致 moduleA 和 moduleB 的 test 编译不通过。
(也有办法强行依赖,在 IDEA 中给 moduleA 和 moduleB 加一个 Java lib,指向 baseModule 的 test 输出路径。但是这样就无法做到全程使用 maven 管理项目,不推荐)
方案二:
把单元测试工具类放到 baseModule 的 source 目录下。
点评:
否决。这样可以解决依赖的问题,但是代码质量很差。因为单元测试工具类是仅供单元测试使用的,如果放到功能代码的目录下,会给其他人造成困扰,可能会在功能代码中误用。
方案三:
新增一个模块,专门存放单元测试工具类。对于需要用到工具类的模块,在 pom.xml 中加一个 dependency,scope 设置为 test。
详细步骤:
(1)新增模块,pom.xml 形如:
<project>
<groupId>groupId</groupId>
<artifactId>artifactId-tests</artifactId>
<version>version</version>
...
</project>
(2)在需要用到单元测试工具类的模块的 pom.xml 中,加入依赖(可以直接在最顶层的 pom.xml 加依赖,所有模块自动继承依赖):
<project>
...
<dependencies>
<dependency>
<groupId>groupId</groupId>
<artifactId>artifactId-tests</artifactId>
<version>version</version>
<scope>test</scope>
</dependency>
</dependencies>
...
</project>
点评:
这是 maven 官方推荐的做法,既解决了测试代码对测试工具类的依赖问题,又不会污染功能代码的目录。
参考链接:https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html