Java 测试类扩展依赖模块中的测试类

Java 测试类扩展依赖模块中的测试类,java,maven-2,Java,Maven 2,我在一个模块中有一个测试类,它在它的一个依赖模块中扩展了另一个测试类。如何将依赖项的测试代码导入依赖模块的测试范围 对于文盲来说,我有两个模块,“模块一”是“模块二”的依赖项SubTestCase是TestCase的一个子类 module-one \src\test\java\com\example\TestCase.java module-two \src\test\java\com\example\SubTestCase.java 单元一 \src\t

我在一个模块中有一个测试类,它在它的一个依赖模块中扩展了另一个测试类。如何将依赖项的测试代码导入依赖模块的测试范围

对于文盲来说,我有两个模块,“模块一”是“模块二”的依赖项
SubTestCase
TestCase
的一个子类

module-one \src\test\java\com\example\TestCase.java module-two \src\test\java\com\example\SubTestCase.java 单元一 \src\test\java\com\example\TestCase.java 单元二 \src\test\java\com\example\SubTestCase.java
但是构建失败了,因为“模块一”的测试代码没有导入到“模块二”,而只是主代码

通常,除了常规的modulename.jar文件之外,还可以通过构建和部署modulename-test.jar文件来解决这个问题。您可以像常规工件一样将它们部署到repo。这并不是完全完美的,但是对于代码工件来说,它工作得很好

然后将测试范围的依赖项添加到其他模块的测试jar中

您还可以通过将测试范围内的工件放在其自己的单独模块的“主”范围内,然后将其包含在其他模块的常规测试范围内来解决这个问题。这种解决方案在多模块构建中效果不太好,在多模块构建中,每个模块导出一些测试工件,因为您基本上得到2N个模块


当我们意识到类的数量相当有限,并且存在与这两种解决方案相关的问题时,我们中的许多人实际上放弃了这两种解决方案。我们只是将它们放在“main”范围中一个适当命名的包中。我总是忘记为什么前两个解决方案是一个难题。

您可以使用。它将附加到项目中,并与分类器测试一起部署

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

org.apache.maven.plugins
maven jar插件
包裹
试验罐
然后,其他项目可以通过在依赖项中声明测试分类器来引用测试jar

<dependency>
  <groupId>name.seller.rich</groupId>
  <artifactId>foo</artifactId>
  <version>1.0.0</version>
  <classifier>tests</classifier>
  <scope>test</scope>
</dependency>

name.seller.rich
福
1.0.0
测验
测试

关于富卖家的回答:
测试的使用已过时,请参见

我正在使用maven 2.2.1和maven jar插件2.2,它需要 切换
testjar
而不是
tests

请注意,jar测试是不可传递的,因此您可能需要显式地添加它们

<project>
    ...
    <dependencies>
        <dependency>
            <groupId>name.seller.rich</groupId>
            <artifactId>foo</artifactId>
            <version>1.0.0</version>
            <type>test-jar</type>
            <scope>test</scope>
         </dependency>
    </dependencies>
     ...
</project>

...
name.seller.rich
福
1.0.0
试验罐
测试
...
更新Mike Sokolov的评论:
maven 3用户协会于2014年3月28日更新,请参见上述say的链接

请注意,本指南以前的版本建议使用 测试而不是测试jar。 虽然目前这种方法适用于某些情况,但在测试JAR模块和任何消费者的反应堆构建期间,它不能正常工作 如果调用了安装之前的生命周期阶段。在这种情况下,, Maven不会从反应堆的输出中解析测试JAR 但从本地/远程存储库生成。显然,这个罐子是从 存储库可能已过时或完全丢失,从而导致 构建失败(参见MNG-2045)


为我工作得很出色,里奇,谢谢你!这应该是公认的答案。krosenvolds的答案是一个公平的讨论,但是没有考虑到maven jar插件特性的这种非常恰当的使用。foo测试的依赖关系是否也包括在内?好的,快速测试说没有。有没有关于如何包含测试源及其依赖项的想法?在gradle,我使用过它,是否也包含了foo测试的依赖项?所有foo的非测试依赖项都将自动包含。如果Foo依赖于bar的测试,那么您需要对Foo/bar应用相同的方法,请参见(Rich的答案),否则Foo将无法通过测试compileNo它的一系列正常依赖项。我只是喜欢这样的想法,例如,在foo中指定在集成测试中使用哪个数据库,并保持bar远离具体的db名称。我相信这个答案是不正确的。测试似乎至少与maven 3.0.3一起工作,所以可能是测试jar解决方案“过时了”?这个答案对我和富商同样有效。Maven 3.3.9。