在多模块 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
中定义)。不幸的是,即使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
下?
【问题讨论】:
查看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 项目中构建所有模块后,如何运行集成测试?