テスト中のクラスの他のクラスをMockitoでモックするにはどうすればよいですか?
例えば:
MyClass.Java
_class MyClass {
public boolean performAnything() {
AnythingPerformerClass clazz = new AnythingPerformerClass();
return clazz.doSomething();
}
}
_
AnythingPerformerClass.Java
_class AnythingPerformerClass {
public boolean doSomething() {
//very very complex logic
return result;
}
}
_
そしてテスト:
_@Test
public void testPerformAnything() throws Exception {
MyClass clazz = new MyClass();
Assert.assertTrue(clazz.performAnything());
}
_
AnythingPerformerClass
から不要なロジックを除外するためにAnythingPerformerClass
をスプーフィングできますか? true
またはfalse
を返すためにdoSomething()
メソッドをオーバーライドできますか?
Mockitoを指定する理由は、Android Robolectricでのテストに必要なためです。
dependency injection を使用するようにMyClass
をリファクタリングできます。 AnythingPerformerClass
インスタンスを作成する代わりに、クラスのインスタンスをMyClass
のコンストラクターに渡すことができます。
class MyClass {
private final AnythingPerformerClass clazz;
MyClass(AnythingPerformerClass clazz) {
this.clazz = clazz;
}
public boolean performAnything() {
return clazz.doSomething();
}
}
その後、単体テストでモック実装を渡すことができます
@Test
public void testPerformAnything() throws Exception {
AnythingPerformerClass mockedPerformer = Mockito.mock(AnythingPerformerClass.class);
MyClass clazz = new MyClass(mockedPerformer);
...
}
または、AnythingPerformerClass
に状態が含まれている場合は、AnythingPerformerClassBuilder
をコンストラクターに渡すことができます。
現在のところ(メソッド内のAnythingPerformerClass
の宣言とインスタンス化の両方で、Mockitoのみを使用してAnythingPerformerClass
をモックすることはできません。
可能であれば、AnythingPerformerClass
の宣言とインスタンス化の両方をクラスレベルに移動します。タイプAnythingPerformerClass
のインスタンス変数を宣言し、コンストラクターでインスタンス化します。
そうすれば、テスト中にAnythingPerformerClass
のモックをより簡単に挿入し、その動作を指定できます。例えば:
when(anythingPerformerClassMock.doSomething()).thenReturn(true);
またはエラー処理をテストするには:
when(anythingPerformerClassMock.doSomething()).thenTrow(new NullPointerException());
Mockitoで何を返すかを設定できます。
when(mock.method()).thenReturn(someValue)