ChatGPT解决这个技术问题 Extra ChatGPT

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

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

数据

消费者

模块 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 installmvn deploy 时,它应该可以在单步构建中正常工作。只是一个简短的说明。在我们的一个大型项目中,我们在 junit 的 TestBase 上有一个包装器,它位于 src/main 中,我认为这也不是一个好主意。

C
Community

您的消费者项目取决于您的数据项目,因此我们很高兴必须在消费者之前构建数据。因此,使用建议的技术 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>

然后,您的 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>

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


关于“您的消费者项目将同时依赖于正常的数据 JAR 工件,加上额外的测试罐工件”部分,当我将数据的依赖项添加到消费者(假设我的工件也名为数据和消费者)pom 时,如果没有特定的版本规范,pom 会出错。为什么会这样?
@StasS 可能最好你打开一个单独的问题。
m
matsev

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


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