如何验证调用了非模拟对象的方法?

how to verify a method of a non-mock object is called?

貌似mockito只验证mock对象的方法是否被调用,mock对象总是有类似doReturn().when(mock object)

的东西

但是我可以创建一个模拟对象并定义 doReturn().when(mock object) 然后验证调用了另一个对象的方法?

这是我想要做的:我定义了一个 mockEnvironment 和 return 无论发生什么情况的响应。但是后来我想验证在不同情况下调用 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(...);
}

您可以为此使用 Mockito Spy。如果您将 anotherObj 设置为间谍,您可以验证对该对象的方法调用。在您的示例中,您需要确保对 foo 的调用使用间谍而不是 anotherObj 的普通实现。间谍设置如下:

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

使用 @Spy 注释对非模拟对象进行注释,然后检查 verify()。检查 this