"モック"は、実際のオブジェクトの動作をシミュレートする空のダミーオブジェクトです。 when(mocked.add(2,3)).thenReturn(5);
のような振る舞いを定義した場合は、正確な値を受け取ったときに何をすべきかを具体的に指示します。
mocked.add(6,7)
は、その時点での動作を定義していないため、デフォルト値を使用しているため、この時点で0
が返されます。したがって、可能なすべての入力をカバーする場合は、ソリューション@MaciejKowalskiを投稿し、Mockito.any(Integer.class)
のような汎用マッチャーを使用してください。
まだ私はモックを正しく扱う方法が明確ではないと思います。モックは、依存関係ツリー全体を設定する必要なしに、被テストシステムに外部依存関係を提供する方法です。そのクラス内の実際のメソッドは通常呼ばれません。これは、when(mocked.add(2,3)).thenReturn(5);
のようなものです。それはのモックに実際にそれを持っていない実際の依存関係のようにのように振る舞います。
の例では、次のようになります。
public class TestClass {
private ExternalDependency dep;
public void setDep(ExternalDependency dep) {
this.dep = dep;
}
public int calculate() {
return 5 + dep.doStuff();
}
}
public class ExternalDependency {
public int doStuff() {
return 3;
}
}
今、あなたのテストコードに次のようなモックを使用することができます。
@Test
public void should_use_external_dependency() {
// Aquire a mocked object of the class
ExternalDependency mockedDep = Mockito.mock(ExternalDependency.class);
// Define its behaviour
Mockito.when(mockedDep.doStuff()).thenReturn(20);
TestClass sut = new TestClass();
sut.setDep(mockedDep);
// should return 25, since we've defined the mocks behaviour to return 20
Assert.assertEquals(25, sut.calculate());
}
sut.calculate()
が呼び出された場合は、ExternalDependency
における方法が本当にすべきではありませんそれは呼び出されたスタブオブジェクトに代わって委任されます。あなたは本当クラスの本当メソッドを呼び出したい場合しかし、あなたはMockito.spy(ExternalDependency.class)
に代わりスパイを使用することができます。また、when(mockedDep.doStuff()).thenCallRealMethod();
であなたの質問は私には意味がないことを行うことができます。あなたは明示的に「引数が2と3のときに5を返し、次に6と7を渡すとき、mockitoに言う...なぜ前提条件が満たされていない場合、そのルールを適用するべきですか? – Tom