在多模块Maven项目中的模块之间共享src / test类


120

我有一个多模块的Maven项目。为了这个示例,请考虑两个模块:

  • data
  • consumer

模块consumer将模块data作为依赖项。

模块data声明了一堆核心类。有src/test使用它们的测试。这些测试需要创建一些冗长的对象,因此我有一个带有一些实用程序方法的类来创建这些对象。实用程序类(SampleDataHelper)在src/test层次结构中。

我在consumer模块中也进行了一些测试,这些测试需要创建一些长期存在的对象。我想在我的树中的测试中使用我的SampleDataHelper类(在data src/test中定义)consumer src/test。不幸的是,即使data是的依赖consumerconsumer也无法看到存在于下的类data src/test

为了解决这个问题,我想我可能会创造另一个模块(data-test),并移动SampleDataHelper下它src/main。然后,我将data-test作为的测试范围依赖性包括在内data。不幸的是,这引入了循环依赖:datauses data-test,而且data-testrequires data

我想出了唯一的解决办法是把SampleDataHelperdata src/main一个下test包,并希望没有真正的应用程序代码以往任何时候都调用它。

我如何SampleDataHelper在模块之间共享我的课程而不放在下面src/main


1
看看这个答案。我认为这应该对您有帮助。
Andrew Logvinov

7
对于未来的读者:Maven使用附加测试指南
Greg Kopff

@AndrewLogvinov:您的链接答案是否需要“两步构建”?首先构建并部署一个模块(data),然后再编译第二个模块(consumer)。
格雷格·科夫

我认为,如果您使用,可能会遇到一些问题mvn package,但是使用mvn install或时,只要一步构建就可以了mvn deploy。请注意。在我们的一个大型项目中,我们在junit的包装上有一个包装,TestBase并且它也位于src/main其中,我也不认为这是个好主意。
Andrew Logvinov

Answers:


152

您的消费者项目取决于您的数据项目,因此我们很高兴必须在消费者之前构建数据。结果,使用注释中建议的技术,我将确保您的Data项目包含您希望共享的所有测试代码,并配置POM以生成测试JAR:

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

然后,您的Consumer项目将同时依赖于正常的Data JAR工件以及其他test-jar工件,当然还有测试范围:

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>data</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>

我已经在很多场合使用了这种方法,并且效果很好。


1
关于“当我将数据的两个依赖项都添加到消费者(假设我的工件也命名为数据和消费者)pom时,“您的消费者项目将同时依赖于正常的Data JAR工件以及附加的测试罐工件”部分,没有特定的版本规范,pom会出错。为什么会这样呢?
约翰尼

@StasS最好是您为此打开一个单独的问题。
邓肯·琼斯


1

那么问题是data模块中的(某些)测试取决于SampleDataHelper类?您可以将移动SampleDataHelpersrc/main的的data-test模块,如果你在同一时间移动测试(依赖于特定的类)到src/test了的data-test模块。因此,将不再有循环依赖。


1
如果您了解我的意思,建议您将所有使用的测试SampleDataHelperdata模块或consumer模块(适当时)移至中data-test。不幸的是,我发现这不是一个非常“整洁”的解决方案,因为它将我的测试从他们测试的模块中移出,并转移到了另一个模块中。(严格来说,您只是说过要移动data测试,但我认为为了保持一致性,我会同时移动两者)。但是,谢谢您的回答。:-)
Greg Kopff

1
是的,您正确理解了我。可以说,它比简单的解决方案更快捷。:-)
matsev

我可以想象循环依存关系仍然存在。假设所讨论的测试使用了Data项目中定义的类,那么仍然需要从Data-Test项目中引用回Data项目。
Duncan Jones

1
@DuncanJones抱歉,我的帖子中有一个小错字。我要说明的是data-test模块应该依赖于data模块(而不是相反)。为避免循环依赖性,必须将当前驻留在使用的data模块中的所有测试SampleDataHelper移至该data-test模块。
13年

知道,这更有意义。
Duncan Jones
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.