如何验证一个非模拟对象的方法被调用?


100

似乎嘲笑仅验证是否调用了嘲笑对象的方法,并且嘲笑对象始终具有类似 doReturn().when(mock object)

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

这是我想做的事情:我定义了一个模拟环境,无论发生什么情况都返回一个响应。但是然后我想验证在不同情况下调用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(...);
}

Answers:


118

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

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

这意味着如果我想验证多个事物,可能需要创建并注入多个模拟对象?那不方便。
user389955 2015年

@ user389955是的,您需要将每个要检查的对象设置为间谍。据我所知,这是没有办法的。Mockito需要向对象添加代理,并且有人必须告诉Mockito要代理哪些对象。
K Erlandsson

10
与其说“ //做东西”,不如说它必须是使“ anotherObjSpy”必须进行测试的方法调用。
jwehrle

感谢@jwehrle,您需要在调用中使用anotherObjSpy,否则测试将无法进行。
argoth,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.