非モックオブジェクトのメソッドが呼び出されたことを確認する方法は?


100

mockitoはモックオブジェクトのメソッドが呼び出されているかどうかを確認するだけであり、モックオブジェクトは常に次のようなものを持っているようです doReturn().when(mock object)

しかし、モックオブジェクトを作成して定義doReturn().when(mock object) し、別のオブジェクトのメソッドが呼び出されることを確認できますか?

これが私がしたいことです:私はmockEnvironmentを定義し、何が起こっても応答を返します。しかし、私は別のケースで呼び出されたanotherObjのさまざまなメソッドを確認したいと思います。

どうやってするか?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}

回答:


118

これにはMockito スパイを使用できます。anotherObjスパイとして設定した場合は、そのオブジェクトのメソッド呼び出しを確認できます。あなたの例では、の呼び出しfooがの通常の実装の代わりにスパイを使用することを確認する必要がありますanotherObj。スパイは次のように設定します:

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);

つまり、複数のものを検証したい場合は、複数のモックオブジェクトを作成して注入する必要があるかもしれません。それは不便です。
user389955

@ user389955はい、チェックしたい各オブジェクトをスパイとして設定する必要があります。私の知る限り、それを回避する方法はありません。Mockitoはオブジェクトにプロキシを追加する必要があり、誰かがMockitoにプロキシするオブジェクトを通知する必要があります。
K Erlandsson、2015年

10
「// do stuff」と言う代わりに、テスト対象のメソッド呼び出しを行う必要があるのは「anotherObjSpy」であることを追加すると役立つ場合があります。
jwehrle 2017年

@jwehrleに感謝します。呼び出しでanotherObjSpyを使用する必要があります。そうしないと、テストが機能しません。
argoth

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.