创建依赖关系只能进行单元测试

时间:2012-12-11 17:02:38

标签: java dependency-injection junit4 dependency-management

我刚刚创建了Manager来处理SuperClass,该SuperClassManager扩展到了整个代码库,并使用某种SCMManager)进行了注册。

现在我想测试只知道SuperClass的{​​{1}}。我尝试创建一个具体的SCM,但这取决于第三方库,因此我在jUnit测试中没有这样做。现在可以选择模拟此SCM的所有实例。

到目前为止一切都很好,但是,当我的Manager处理SCM时,它会返回我SuperClass不知道或关心的Manager的孩子。尽管如此,这些孩子的身份对于我的测试来说是非常重要的(对于平等等)。

由于我不能使用具体的SCM,我必须模拟调用SCM的相应函数的结果,但是,这意味着我的测试和(间接)我的{{1需要了解和关心Manager的孩子。

检查代码库,我的测试似乎没有更合适的位置(已经保持适当的实际依赖关系)。

值得吗为单元测试引入不必要的依赖项?


更新18 / DEC / 2012


以下是我的问题的简化版本:

SuperClass

可以看出,在测试TopComponentManager时,我必须验证此包中未知的已确定的必要元素。

4 个答案:

答案 0 :(得分:2)

为什么不直接模仿TopComponent

示例:

@Mocked
TopComponent _childTopComponent1;

答案 1 :(得分:0)

当调用模拟方法时,不确定这是否是您要查找的内容,而是Mockito provide a way to return mocks

SCM scmMock = Mockito.mock(SCM.class, Mockito.RETURNS_MOCKS);
// scmMock.someMethod() will return a mock

答案 2 :(得分:0)

也许如果你可以使用一些代码,那么给你答案会更容易。

另外,当SuperClassManager只知道Manager时,如何致电SuperClass?它是SuperClass内的依赖吗?如果是这种情况,则SuperClass具有错误的依赖关系,您应该考虑将其从SuperClass中删除。

但如果您的经理不知道SCM,但只知道SuperClass,那么您应该模仿SuperClass,因为Manager的测试不得依赖于其他组件的代码,您不应该创建不必要的依赖。

答案 3 :(得分:0)

我最终通过创建一个只包含我的测试类的新项目来解决这个问题。此测试类依赖于TopComponentManager和遍布代码库的所有子TopComponent。但是,依赖关系不是问题。

通过这种方法,可以在此项目中实施更多测试,这些测试不会对生产代码产生任何其他依赖性。