Maven 工程,单元测试工具类如何安放?

大型 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