使用Maven和ParameterSupplier的项目组织

时间:2012-10-25 14:46:31

标签: java junit

我想知道在下列情况下对项目/模块组织会有什么建议:

  1. 我有一个项目DomainObjects,其中我有一个班级MyObject
    1. /src/test/java DomainObjects MyObject我对Client
    2. 进行了测试
  2. 我的项目DomainObjects取决于ParameterSupplier
  3. 我想添加一个名为MyObjectTestSupplier类的MyObject来提供Client的测试实例,供MyObjectTestSupplier中的测试使用。

    DomainObjects项目中提供src/test/java似乎最有意义。这是我的困境......

    1. 如果我将供应商放在DomainObjects的{​​{1}},Client将无法使用。
    2. 我不想将它放在src/main/java的{​​{1}}中,因为这意味着JUnit必须作为DomainObjects的编译依赖项包含在内,从而包含在我的生产中代码。
    3. 如果我将供应商放在某个项目中DomainObjects我有三个选择
      1. 只是供应商是测试项目,但这意味着DomainObjectsTest中的测试无法使用此供应商。
      2. DomainObjects的所有测试和供应商放入DomainObjects,但这意味着即使测试失败,maven也会成功编译DomainObjectsTest
      3. DomainObjects的{​​{1}}和src/test/java的{​​{1}}中复制供应商。
    4. 我考虑过尝试将DomainObjects作为src/main/java的模块,但仅当DomainObjectsTest的包装DomainObjectsTestDomainObjects不起作用时才有效。

      思考?建议?

      编辑:作为解释,DomainObjects是一个简单的bean(只是getter和setter),我使用pom模式来提供填充的bean实例。供应商提供实用程序方法,以便轻松创建bean的填充实例以供测试。我这样做是为了不在整个项目中重复这个人口代码(或模拟等效)。

2 个答案:

答案 0 :(得分:1)

这是一个糟糕的设计实例,你所描述的。您的单元测试不能依赖于外部依赖性为“单元”。

您需要做的是模拟所有依赖项并仅测试Client代码。根据您对此类的期望,使用Mockito或您选择的其他库在客户端项目中创建MyObject的模拟实例。在自己的项目中测试MyObject行为 - DomainObjects

在mockito中创建模拟只是:

import static org.mockito.Mockito.*;
...
MyObject myMock = mock(MyObject.class);
when(myMock.doWhatYouNeed(params)).thenReturn(whatYouExpect);

修改:

另一个想法

将DomainObjects的测试作为类型test-jar的工件发布为descibed here,并将其用作Client中的测试范围依赖项。但这太丑了......

好的设计是:

  • DomainObjectAPI项目MyObject
  • DomainObjectTestSupplier使用DomainObjectAPI提供供应商,
  • DomainObject使用DomainObjectAPI进行编译,使用DomainObjectTestSupplier进行测试
  • Client使用DomainObjectAPIDomainObject进行编译,使用DomainObjectTestSupplier进行测试。

这只是一种矫枉过正。

答案 1 :(得分:1)

正如the official Maven mini guide on this particular topic所说,您应该将DomainObjects项目的测试工件发布到您当地的Maven存储库(或您想要或能够的任何地方)并使用DomainObjects-X.Y-tests工件作为Client项目中的测试范围依赖项。

使用the jar:test-jar goal of the Maven JAR plugin发布测试工件。

如果在Client项目中将此工件作为测试范围的依赖项包含在内,则依赖于Client项目的任何其他项目都不会继承您的DomainObjects项目的测试工件,因为默认情况下测试范围的依赖关系不是传递的,如the official guide on Maven's dependency mechanism所述。