如何在项目B中包含来自依赖项目A的测试,并让他们认可Maven"按原样#34;

时间:2016-03-08 20:50:30

标签: java maven junit4

我有一个(Maven)项目B依赖于项目A.项目A将其测试打包到一个jar中,如here所述。假设我在项目A中有一个测试类com.forelight.a.FooTest。该类在项目B中的测试范围的类路径上可见,但不会由mvn test自动执行。我可以在项目B的test/main/java目录中扩展FooTest,如下所示:

package com.forelight.b;
public class FooBarTest extends com.forelight.a.FooTest {}

这就完成了工作(mvn test在命令行和日食下运行)但感觉很糟糕。

1 个答案:

答案 0 :(得分:2)

这是一个有效的自动化解决方案:

  • 项目A还应提供其test-sources jar
  • 项目B应在测试范围内导入项目A,并在测试范围中导入项目A测试源
  • 项目B将使用Maven Dependencies插件的unpack-dependencies自动将测试源jar解压缩到目标文件夹的子文件夹(例如project-a-test-sources
  • 项目B将使用Build Helper Maven插件的add-test-source目标自动添加解压缩的源作为项目A中的测试源
  • Maven将编译并运行添加的源代码作为项目B测试的一部分

要实现它,在项目A中将以下内容添加到构建部分:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <executions>
        <execution>
            <id>attach-sources</id>
            <goals>
                <goal>test-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这实际上会创建一个新的jar作为提供测试源的构建的一部分。请务必通过mvn install安装。

在项目B中,将以下内容添加到依赖项中:

<dependency>
    <groupId>com.sample</groupId>
    <artifactId>project-a</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.sample</groupId>
    <artifactId>project-a</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>test</scope>
    <classifier>test-sources</classifier>
</dependency>

为了使用项目A填充类路径,第二个依赖项是无害的,它将被下面的插件执行使用。

在项目B中,还要将以下内容添加到构建部分:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
                <id>unpack-test-sources</id>
                <phase>generate-test-sources</phase>
                <goals>
                    <goal>unpack-dependencies</goal>
                </goals>
                <configuration>
                    <includeGroupIds>com.sample</includeGroupIds>
                    <includeArtifactIds>project-a</includeArtifactIds>
                    <includeScope>test</includeScope>
                    <includeClassifiers>test-sources</includeClassifiers>
                    <outputDirectory>
                        ${project.build.directory}/project-a-test-sources
                    </outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.10</version>
        <executions>
            <execution>
                <id>add-test-source</id>
                <phase>generate-test-sources</phase>
                <goals>
                    <goal>add-test-source</goal>
                </goals>
                <configuration>
                    <sources>
                        <source>${project.build.directory}/project-a-test-sources</source>
                    </sources>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>

这里我们正在解压缩源并将它们添加为测试源。

然后,

Maven将自动执行添加的测试。

对这种方法的几点考虑:

  • 它可能看起来像您在问题中提到的方法一样,尽管它会自动化并且不需要创建新的扩展测试
  • 这绝对不是标准的东西,但原始要求也听起来不像标准做法
  • 您可能在测试名称或资源名称上存在冲突(同样,因为它不是标准方法)
  • 您可能不希望将这些外部测试作为默认构建的一部分运行,在这种情况下,您可以将上面的配置移到Maven profile,比如说run-project-a-tests并仅在需要时通过{执行它们{1}}。这也将使您的默认构建更快(更标准)。