解决test,testhelper和test-in-test之间的Maven循环依赖关系

时间:2012-04-16 12:57:40

标签: unit-testing maven maven-2 dependencies circular-dependency

我的设置是这样的。我有项目A,以及一个取决于A的测试项目:

A <- A_t

我还有其他项目取决于A(以及他们的测试):

A <- B <- B_t

为了简化某些测试,我引入了一个新的库来帮助测试基于A的东西:

A <- Atesthelper

所以A_t(和B_t)将取决于此测试助手,如下所示:

A <- A_t
^    |
|    v
Atesthelper

然而,当我创建Maven项目(pom.xml)时,似乎通常将项目和该项目的测试捆绑在同一个pom.xml中。我为Atesthelper

创建了一个新的pom.xml

现在它变成了:

(A <- A_t)
  ^    |
  |    v
Atesthelper

这是循环依赖。是否有可能在pom.xml中以某种方式指定Atesthelper只是测试构建目标的依赖项,而不是A模块本身的依赖项?

所以构建顺序应该是:A,Atesthelper,A_t。即不应在同一个pom中指定A和A_t。

提前致谢。

4 个答案:

答案 0 :(得分:5)

如果我理解正确,您的主要目标是重用测试类。 A_t和Atesthelper不是Maven项目,而是测试。

让Maven从你的src / test / java创建一个jar。见http://maven.apache.org/guides/mini/guide-attached-tests.html

在构建A之后,您将获得A.jar和A-tests.jar。 A-tests.jar将包括Atesthelper和A_t。

将B的依赖关系设置为A-tests.jar(<type>test-jar</type>)

答案 1 :(得分:1)

您需要解决的问题是从 Atesthelper A 的依赖关系,然后其他一切都能正常工作: A 取决于< em> Atesthelper , B 依赖于 Atesthelper A B 都包含两个来源和试验。 A B 中的 Atesthelper 将包含在范围 test 中。这是你的目标状态。

你是如何到达那里的?您需要将 Atesthelper 所依赖的项目提取到单独的项目中。通常,这些是接口或其他常见功能,无论如何都应该放在一个单独的项目中 - 让我们称之为 ACommon 。所以你的目标布局应该是这样的:

ACommon <- Atesthelper
       ^    ^
       |   /
         A (and also B)

Atesthelper 的功能取决于 A ?你能把它移到一个单独的项目( ACommon )吗?

答案 2 :(得分:0)

你没有粘贴你的POM,我不确定我是否理解你,但我会尽力帮助你。这是很常见的情况,通常应该像这样解决:

支持测试的Atesthelper工件(可能是jar打包)应该在src/main目录中包含所有与测试相关的内容(所以src/main/java中的类, src/main/resources等中的资源,而不是src/test!它的所有依赖项,A,还有像JUnit,EasyMock(测试支持类需要的所有东西)之类的东西,你用compile范围声明,这当然是默认的。不要在这里使用test范围!最后,在AB工件中,将Atesthelper声明为test范围的依赖关系。

这个解决方案多年来对我很有用。关于依赖关系是干净利落的(如果你知道我的意思,它们与基于<type>test-jar</type>的解决方案相比具有传递性。无论如何,只需使用它。你会很高兴;)。

答案 3 :(得分:0)

解决此问题最简洁的方法是将项目分开。像Maven这样的框架鼓励您将Classes和Test Classes放在一个单独的项目中。例如,Eclipse PlugIn项目具有单独的测试项目。使A_t成为A的子项目听起来像是最好的解决方案,因为您可以在该测试项目中重用所需的任何依赖项,而不必担心对A的影响。

这种情况会更频繁地出现,您可能不希望使用测试的依赖性来打扰您的项目设计。这些测试应该是独立的,不会影响你的课堂设计。