我应该在哪里放置Java库的测试支持代码

Aar*_*lla 6 unit-testing module maven

我有一个Maven项目,在其他项目中用作库.设置非常标准:src/main使用库代码,src/test带有测试用例src/main.

我们假设我有一个foo依赖于这个库的项目.foo还有测试用例.为了帮助编写foo使用我的库的代码的测试,我想提供foo一个支持框架来编写测试(比如设置一个模拟环境).

我在哪里可以提供此支持代码?

  • 它不应该进入,src/main因为它不打算投入生产.
  • 它不能进入​​,src/test因为从foo库的测试到库的测试创建依赖会给类路径添加太多垃圾(比如logback-test.xml配置文件,从未执行的测试,......).

我可以将代码放入一个新模块,但它与代码紧密耦合src/main,所以我想将它保存在同一个项目中(也允许测试支持代码访问包私有字段和方法).

此外,代码src/test应该可以访问它,以便我可以使用它来编写我自己的单元测试.

什么是我与Maven选项,使这个在同一项目但仍清晰地从两个分开src/mainsrc/test?我可以以某种方式创建第三个输出JAR src/test-support吗?或者我应该将代码放入src/test,然后在JAR插件中使用过滤器仅包含支持代码?

Aar*_*lla 0

下面是一个 POM 片段,它将主 JAR 分为普通工件和“JUnit 支持 JAR”:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <id>default-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <archive>
                            <index>true</index>
                            <manifest>
                                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            </manifest>
                        </archive>
                        <excludes>
                            <exclude>**/junit/**</exclude>
                        </excludes>
                    </configuration>
                </execution>

                <execution>
                    <id>junit-jar</id>
                    <phase>package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <classifier>junit</classifier>
                        <archive>
                            <index>true</index>
                            <manifest>
                                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            </manifest>
                        </archive>
                        <includes>
                            <include>**/junit/**</include>
                        </includes>
                    </configuration>
                </execution>

                <execution>
                    <id>test-jar</id>
                    <goals>
                        <goal>test-jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>
Run Code Online (Sandbox Code Playgroud)

简而言之,它会查找junit名称中包含 的任何包并将其放入 JUnit JAR 中,将其从正常工件中排除。

如果普通罐子的坐标是

<groupId>com.group</groupId>
<artifactId>foo</artifactId>
Run Code Online (Sandbox Code Playgroud)

那么您只需添加以下内容即可获取 JUnit 支持代码<classifier>junit</classifier>

<groupId>com.group</groupId>
<artifactId>foo</artifactId>
<classifier>junit</classifier>
Run Code Online (Sandbox Code Playgroud)

因此,要使用它,所依赖的 POMcom.group:foo将如下所示:

<dependency>
    <groupId>com.group</groupId>
    <artifactId>foo</artifactId>
    <version>...</version>
</dependency>
<dependency>
    <groupId>com.group</groupId>
    <artifactId>foo</artifactId>
    <version>...</version>
    <classifier>junit</classifier>
    <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

有时,您需要 JUnit 来编译“JUnit 支持 JAR”。如果是这种情况,请使用

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>compile</scope>
    <optional>true</optional>
</dependency>
Run Code Online (Sandbox Code Playgroud)

将 JUnit 包含到构建中。这将使依赖项在编译时可用,但不会泄漏给其他任何人。