6

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

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

我可以把这个支持代码放在哪里?

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

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

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

src/mainMaven 有什么选择可以将其保留在同一个项目中,但仍将其与 和完全分开src/test?我可以以某种方式创建第三个输出 JARsrc/test-support吗?还是应该将代码放入src/testJAR 插件中然后使用过滤器以仅包含支持代码?

4

2 回答 2

3

您可以使用 Maven Jar 插件执行此操作

Maven Jar 插件

由于您使用的是 Maven,因此您可以剪切包含要在 foo 中使用的库的项目的单独工件,添加以下插件以创建另一个 jar 工件:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3.2</version>
    <executions>
       <execution>
          <goals>
              <goal>test-jar</goal>
          </goals>
       </execution>
    </executions>
  </plugin>

这将在该项目中创建 src/test 目录中所有内容的第二个 jar。

测试罐

你可以用一些过滤器拼接出你不需要的那个罐子里的东西。

然后要使用这个库,你可以把它作为依赖包含在 foo 中:

 <dependency>
    <groupId>your.group</groupId>
    <artifactId>parent-artifact-id</artifactId>
    <version>1.0.0</version>
    <type>test-jar</type>
    <scope>test</scope>
 </dependency>

要进一步分离项目,您还可以使用更多框架化的测试 jar 创建一个仅测试项目。
请参阅如何在 Maven Jar Plugin 文档中创建包含测试类的 jar(首选方式)

于 2012-12-21T13:37:57.650 回答
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>

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

如果普通罐子的坐标是

<groupId>com.group</groupId>
<artifactId>foo</artifactId>

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

<groupId>com.group</groupId>
<artifactId>foo</artifactId>
<classifier>junit</classifier>

因此,要使用它,所依赖的 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>

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

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>compile</scope>
    <optional>true</optional>
</dependency>

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

于 2013-11-22T15:58:34.930 回答