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

use*_*955 71 java unit-testing mockito

似乎mockito只验证是否调用了模拟对象的方法,并且模拟对象总是具有某种功能.像doReturn().when(模拟对象)...

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

这就是我想要做的:我定义一个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(...);
}
Run Code Online (Sandbox Code Playgroud)

K E*_*son 97

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

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);
Run Code Online (Sandbox Code Playgroud)

  • 可能有助于添加必须使方法调用进行测试的"anotherObjSpy",而不是说"// do stuff". (8认同)
  • 这意味着如果我想验证多个事物,我可能需要创建并注入多个模拟对象?那不方便。 (2认同)

Cod*_*ter 13

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