コードベース全体に拡張され、ある種の( ) に登録されてManager
いる を処理する を作成しました。SuperClass
SuperClassManager
SCM
Manager
ここで、 のみを認識しているmy をテストしたいと思い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 のテスト中に、このパッケージでは不明であると判断された必要な要素を検証する必要があります。