web-dev-qa-db-ja.com

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

Mockitoは、モックオブジェクトのメソッドが呼び出され、モックオブジェクトが常にsthを持っているかどうかを確認するだけです。 doReturn()。when(モックオブジェクト)...

しかし、モックオブジェクトを作成して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(...);
}
67
user389955

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

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff
verify(anotherObjSpy).codePath1(...);
91
K Erlandsson