ChatGPT解决这个技术问题 Extra ChatGPT

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

似乎 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(...);
}

g
geco17

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

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

这意味着如果我想验证多个事物,我可能需要创建和注入多个模拟对象?那不方便。
@user389955 是的,您需要将要检查的每个对象设置为间谍。据我所知,没有办法解决这个问题。 Mockito 需要为对象添加代理,并且必须有人告诉 Mockito 代理哪些对象。
与其说“//do stuff”,不如补充说它是“anotherObjSpy”,它必须使方法调用被测试。
感谢@jwehrle,您需要在调用中使用 anotherObjSpy,否则测试将无法正常工作。
我有一个我不能调用 spy 的最终方法
C
CodeHunter

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