Mockito在间谍上使用doAnswer

Mos*_*ari 3 java junit mockito

我想用什么时候(间谍).thenAnswer(新的答案())但似乎然后答案只在模拟而不是间谍上工作.我想使用间谍,因为我只想存根特定的方法.

有没有办法对间谍对象做出回答?

Vir*_*nie 6

正如官方文档中所述,有可能,有时甚至建议:

间谍真实物体的重要问题!

有时,使用(对象)咒语间谍是不可能或不切实际的.因此在使用间谍时请考虑使用doReturn | Answer | Throw()系列方法进行存根.

但是,正如该文件所述:

Stubbing void需要不同于when(Object)的方法,因为编译器不喜欢括号内的void方法...

你的方法无效吗?

如果void,文档中的示例:

doAnswer(new Answer() {
    public Object answer(InvocationOnMock invocation) {
        Object[] args = invocation.getArguments();
        Mock mock = invocation.getMock();
        return null;
    }
}).when(mock).someMethod();
Run Code Online (Sandbox Code Playgroud)

因此,如果方法无效,则应使用以下代码:

MyObject spy = spy(myObject);

doAnswer(new Answer<Object>() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        return null;
    }
}).when(spy).notify();   
Run Code Online (Sandbox Code Playgroud)

或者如果它不是无效的:

when(spy.toString()).thenAnswer(new Answer<String>() {
    @Override
    public String answer(InvocationOnMock invocation) throws Throwable {
        return "this";
    }
});
Run Code Online (Sandbox Code Playgroud)


Mos*_*ari 6

查看您的代码后,我发现问题当使用间谍时,我们需要使用

doAnswer.(new Answer<T>() {..}).when(spy).method()
Run Code Online (Sandbox Code Playgroud)

并不是 !!!

when(spy.method()).thenAnswer(new Answer<T>() {..})
Run Code Online (Sandbox Code Playgroud)

谢谢