我想知道在下列情况下对项目/模块组织会有什么建议:
DomainObjects
,其中我有一个班级MyObject
/src/test/java
DomainObjects
MyObject
我对Client
DomainObjects
取决于ParameterSupplier
我想添加一个名为MyObjectTestSupplier
类的MyObject
来提供Client
的测试实例,供MyObjectTestSupplier
中的测试使用。
在DomainObjects
项目中提供src/test/java
似乎最有意义。这是我的困境......
DomainObjects
的{{1}},Client
将无法使用。src/main/java
的{{1}}中,因为这意味着JUnit必须作为DomainObjects
的编译依赖项包含在内,从而包含在我的生产中代码。DomainObjects
我有三个选择
DomainObjectsTest
中的测试无法使用此供应商。DomainObjects
的所有测试和供应商放入DomainObjects
,但这意味着即使测试失败,maven也会成功编译DomainObjectsTest
DomainObjects
的{{1}}和src/test/java
的{{1}}中复制供应商。我考虑过尝试将DomainObjects
作为src/main/java
的模块,但仅当DomainObjectsTest
的包装DomainObjectsTest
在DomainObjects
不起作用时才有效。
思考?建议?
编辑:作为解释,DomainObjects
是一个简单的bean(只是getter和setter),我使用pom
模式来提供填充的bean实例。供应商提供实用程序方法,以便轻松创建bean的填充实例以供测试。我这样做是为了不在整个项目中重复这个人口代码(或模拟等效)。
答案 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
使用DomainObjectAPI
,DomainObject
进行编译,使用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所述。