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

Posted

技术标签:

【中文标题】在多模块 maven 项目中的模块之间共享 src/test 类【英文标题】:Sharing src/test classes between modules in a multi-module maven project 【发布时间】:2013-01-21 06:51:00 【问题描述】:

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

data consumer

模块 consumer 具有模块 data 作为依赖项。

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

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

为了解决这个问题,我想我可以创建 另一个 模块 (data-test),并将 SampleDataHelper 移动到 src/main 下。然后我会将data-test 包含为data测试范围 依赖项。不幸的是,这引入了循环依赖:data 使用data-test,但data-test 也需要data

我想出的唯一解决方案是将SampleDataHelper 放在data src/main 下的test 包下,并希望没有真正的应用程序代码调用它。

我怎样才能在模块之间共享我的SampleDataHelper而不将它放在src/main 下?

【问题讨论】:

查看this answer。我认为它应该对你有所帮助。 未来读者:Maven Guide to using attached tests @AndrewLogvinov:您的链接答案不需要“两步”构建吗?在编译第二个模块 (consumer) 之前,首先构建并部署一个模块 (data)。 我认为如果您使用mvn package,您可能会遇到一些问题,但是当您使用mvn install 或@987654357 时,它应该可以在一步构建中正常工作@。只是一个简短的说明。在我们的一个大型项目中,我们对 junit 的 TestBase 进行了包装,它位于 src/main,我也不认为这是一个好主意。 【参考方案1】:

您的 Consumer 项目取决于您的 Data 项目,因此我们很高兴 Data 必须在 Consumer 之前构建。因此,使用in the comments 建议的技术,我将确保您的数据项目包含您希望共享的所有测试代码,并配置 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>

然后,您的消费者项目将依赖于正常的 Data JAR 工件以及附加的 test-jar 工件,当然还有测试范围:

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

我在很多场合都使用过这种方法,效果很好。

【讨论】:

当我将数据的依赖项添加到消费者时(假设我的工件名为数据和消费者)pom,没有特定版本规范,pom 出错。为什么会这样? @StasS 最好打开一个单独的问题。 做到了:) ***.com/questions/32119591/…【参考方案2】:

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

【讨论】:

如果我理解你的意思,你建议将任何使用SampleDataHelper 的测试从data 模块或consumer 模块(视情况而定)移动到data-test。不幸的是,我发现这不是一个非常“简洁”的解决方案,因为它将我的测试从他们测试的模块中移出,并移到另一个模块中。 (严格来说,您只是说移动 data 测试,但我想我会发现自己移动两者是为了保持一致性)。但是谢谢你的回答。 :-) 是的,你正确地理解了我。可以说,它更像是一种快速的解决方案,而不是一个简洁的解决方案。 :-) 我想循环依赖仍然存在。假设有问题的测试执行 Data 项目中定义的类,则仍然需要从 Data-Test 项目中返回对 Data 项目的引用。 @DuncanJones 抱歉,我的帖子中有一个小错字。我要说明的是data-test 模块应该依赖于data 模块(而不是相反)。为避免循环依赖,当前驻留在data 模块中且使用SampleDataHelper 的所有测试都必须移至data-test 模块。 明白了,这更有意义。

以上是关于在多模块 maven 项目中的模块之间共享 src/test 类的主要内容,如果未能解决你的问题,请参考以下文章

在多模块 SDK Android 库项目中配置 proguard

在多模块 Maven 项目中更新模块的版本号

在多模块 Maven 项目中构建所有模块后,如何运行集成测试?

使用 Spring 在多模块 Maven 项目中进行集成测试

如何在多模块 Maven 项目中自动重用依赖版本?

在多模块 Maven 项目中运行 exec-maven-plugin 时出现问题