我有一个多模块 Maven 项目。为了这个例子,考虑两个模块:
数据
消费者
模块 consumer
具有模块 data
作为依赖项。
模块 data
声明了一堆核心类。 src/test
下有使用它们的测试。这些测试需要一些冗长的对象创建,所以我有一个类,其中包含一些实用方法来创建这些对象。此实用程序类 (SampleDataHelper
) 位于 src/test
层次结构中。
我还在 consumer
模块中有一些测试需要创建其中一些冗长的对象。我想在驻留在我的 consumer src/test
树中的测试中使用我的 SampleDataHelper
类(在 data src/test
中定义)。遗憾的是,即使 data
是 consumer
的依赖项,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
下?
consumer
) 之前,首先构建和部署一个模块 (data
)。
mvn package
,我认为您可能会遇到一些问题,但是当您使用 mvn install
或 mvn deploy
时,它应该可以在单步构建中正常工作。只是一个简短的说明。在我们的一个大型项目中,我们在 junit 的 TestBase
上有一个包装器,它位于 src/main
中,我认为这也不是一个好主意。
您的消费者项目取决于您的数据项目,因此我们很高兴必须在消费者之前构建数据。因此,使用建议的技术 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>
我在很多场合都使用过这种方法,而且效果很好。
所以问题是 data
模块中的(某些)测试依赖于 SampleDataHelper
类?如果您同时将测试(取决于特定类)移动到 data-test
模块的 src/test
,则可以将 SampleDataHelper
类移动到 data-test
模块的 src/main
。因此,将不再有循环依赖。
SampleDataHelper
的测试从 data
模块或 consumer
模块(视情况而定)移至 data-test
。不幸的是,我发现这不是一个非常“简洁”的解决方案,因为它将我的测试从他们测试的模块中移出,并移到另一个模块中。 (严格来说,您只是说移动 data
测试,但我想我会发现自己移动两者是为了保持一致性)。但是谢谢你的回答。 :-)
data-test
模块应该依赖于 data
模块(而不是相反)。为避免循环依赖,当前驻留在使用 SampleDataHelper
的 data
模块中的所有测试都必须移至 data-test
模块。
不定期副业成功案例分享