我刚刚创建了一个Manager
处理SuperClass
在整个代码库中扩展并使用某种SuperClassManager
( SCM
) 注册的 a。
现在我想测试我Manager
只知道SuperClass
. 但是,我试图创建一个具体SCM
的依赖于第三方库的库,因此在我的 jUnit 测试中没有做到这一点。现在的选项是模拟 this 的所有实例SCM
。
到目前为止一切都很好,但是,当我Manager
处理 时SCM
,它会返回SuperClass
我Manager
不知道或不关心的子项。然而,这些孩子的身份对我的测试(平等等)至关重要。
由于我不能使用具体的SCM
,我必须模拟调用适当函数的结果SCM
,然而,这意味着我的测试和(间接)我Manager
需要了解和关心SuperClass
.
检查代码库,我的测试似乎没有更合适的位置(已经维护了适当的实际依赖项)。
为了单元测试而引入不必要的依赖是否值得?
2012 年 12 月 18 日更新
这是我的问题的简化版本:
package some.package.declaration;
import some.open.source.framework.TopComponent;
import some.open.source.framework.WindowManager;
/**
* Own source code.
* Knows WindowManager and TopComponent; but no
* direct child of TopComponent.
*/
class TopComponentManager{
/**
*
*/
void efficientlyDoOperationsOnCurrentTopComponents(){
Set<TopComponent> currentTopComponents = get all current TopComponents from WindowManager;
Set<TopComponent> getNeededTopComponents(currentTopComponents);
do some operations on the current TopComponents;
...
...
}
void Set<TopComponent> getNeededTopComponents(Set<TopComponent> givenTopComponents){
Set<TopComponent> neededTopComponents = new HashSet<TopComponent>(givenTopComponents);
disregard and keep some TopComponents based on controls;
return neededTopComponents;
}
}
package some.package.declaration.test; // same project as TopComponentManager
import jmockit;
import some.open.source.framework.TopComponent;
import some.open.source.framework.WindowManager;
import own.source.code.childrenOfTopComponent.ChildTopComponent; // Don't want to; need to introduce package dependencies
import own.source.code.childrenOfTopComponent.AnotherChildTopComponent; // Don't want to; need to introduce package dependencies
class TopComponentManagerTest{
@Tested
TopComponentManager _topComponentManager;
@Mocked
WindowManager _windowManager;
@Mocked
ChildTopComponent _childTopComponent1; //extends TopComponent; unknown to both TopComponentManager and TopComponentManagerTest
@Mocked
AnotherChildTopComponent _childTopComponent2; //extends TopComponent; unknown to both TopComponentManager and TopComponentManagerTest
Set<TopComponent> _currentTopComponents = new HashSet<TopComponent>();
@Before
void setUp() throws Exception {
_currentTopComponents.add(_childTopComponent1);
_currentTopComponents.add(_childTopComponent2);
}
void testgetNeededTopComponents(){
Deencapsulation.invoke(_topComponentManager, "getNeededTopComponents", _currentTopComponents);
new Verifications(){{
verify that only _childTopComponent2 is returned;
}};
}
}
可以看出,在测试 TopComponentManager 时,我必须验证已确定的必要元素,这些元素在此包中是未知的。