6

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

A <- A_t

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

A <- B <- B_t

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

A <- Atesthelper

所以A_t(and B_t) 将依赖于这个测试助手,像这样:

A <- A_t
^    |
|    v
Atesthelper

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

所以现在变成了:

(A <- A_t)
  ^    |
  |    v
Atesthelper

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

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

提前致谢。

4

4 回答 4

7

如果我理解正确,您的主要目标是重用测试类。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>).

于 2014-08-15T07:31:41.213 回答
1

您需要解决的问题是从AtesthelperA的依赖关系,那么其他一切都会正常工作:A依赖于AtesthelperB依赖于Atesthelper并且AB都将包含源代码和测试。Atesthelper将包含在AB中的范围测试中。那是你的目标状态。

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

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

Atesthelper依赖于A中的哪种功能?你能把它移到一个单独的项目(ACommon)吗?

于 2012-04-16T15:05:41.343 回答
0

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

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

多年来,该解决方案对我来说非常有用。它对依赖项干净而直接(<type>test-jar</type>如果您知道我的意思,它们与基于 - 的解决方案相比是可传递的)。无论如何,只是使用它。你会很高兴的;)。

于 2012-04-16T13:36:51.950 回答
0

解决此问题的最简洁方法是将项目分开。像 Maven 这样的框架鼓励您将类和测试类放在一个项目中。例如,Eclipse 插件项目有单独的测试项目。制作听起来像是最好的解决方案A_t的子项目A,因为您可以在该测试项目中重用您想要的任何依赖项,而不必担心对A.

这种情况会更频繁地出现,您可能不想因测试的依赖关系而打扰您的项目设计。这些测试应该是独立的,并且不会影响您的课程设计。

于 2017-02-07T22:00:30.440 回答