次の例では
when(myMethod("abc", 123)).thenReturn(456);
when()メソッドは、実際に呼び出すことなくメソッド名と引数をどのようにキャッチしmyMethod()ますか?
後で呼び出す引数としてwhen()メソッド ポインタと s の配列を取得するために、同じことを行うメソッドを作成できますか?Object
メソッドmyMethod が呼び出されます。しかし、それはモック オブジェクトで呼び出されています。これが「トリック」です。
もちろん、「メソッド ポインター」 (Java では、 class のオブジェクトMethod) といくつかの引数を受け入れるコードを記述して、 を使用することもできますが、実際にはモック オブジェクトを直接invoke呼び出すよりも何も得られません。myMethod
when次のように呼ばれるのがより一般的です。
MyObject myObject = mock(MyObject.class);
when(myObject.myMethod("abc", 123)).thenReturn(456);
式を印刷 (またはログ) してみてください
myObject.getClass().getName()
ここ。モック オブジェクトのクラスが実際には ではないことがわかりますMyObject。しかし、それは同じインターフェースを持つクラスのものです。このオブジェクトの呼び出しは、一部の内部状態を更新します。これにより、Mockito は使用方法を追跡でき、さまざまなことをアサートできます。
上記の例でmyMethodは、モック オブジェクトのメソッドです。予期せずに、Mockito はnullデータ型に応じて 、0、または falseを返し、警告なくwhen破棄します。
whenただし、モックではなく、 を使用して作成されたオブジェクトで使用することもできますMockito.spy()。この場合、メソッドは実際にはwhenメソッド内で呼び出されますが、これは多くの場合、やりたいことではありません。Mockito はdoReturn(またはおそらくdoAnsweror doThrow) と呼ばれる別のメソッドを提供し、元のオブジェクトが呼び出されないように置換オブジェクトを提供します ( docs )。
doReturn(1).when(mySpiedObject).getSomeInteger(anyString(), eq("seven"));
Mockito のドキュメントでは、後者がタイプ セーフではないwhenためではなく、使用を推奨していることに注意してください。doReturn