次の例では
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
(またはおそらくdoAnswer
or doThrow
) と呼ばれる別のメソッドを提供し、元のオブジェクトが呼び出されないように置換オブジェクトを提供します ( docs )。
doReturn(1).when(mySpiedObject).getSomeInteger(anyString(), eq("seven"));
Mockito のドキュメントでは、後者がタイプ セーフではないwhen
ためではなく、使用を推奨していることに注意してください。doReturn