Mockito:在Spy上使用doAnswer

5
我希望使用when(spy).thenAnswer(new Answer())方法,但似乎thenAnswer方法只适用于mock而不适用于spy。 我想使用spy,因为我只想stub特定的方法。
有没有一种方法可以对spy对象进行答案操作?
2个回答

10
正如官方文档documentation所述,有时甚至建议使用以下方法:

关于监视真实对象的重要提示!

有时候,对于间谍的存根而言,使用when(Object)是不可能或不切实际的。因此,在使用间谍时,请考虑使用doReturn|Answer|Throw()系列的方法进行存根。

但是,再次根据doc所述:

存根空值需要与when(Object)采用不同的方法,因为编译器不喜欢括号内的空方法...

你的方法是空的吗?
来自文档的示例(如果为空):
doAnswer(new Answer() {
    public Object answer(InvocationOnMock invocation) {
        Object[] args = invocation.getArguments();
        Mock mock = invocation.getMock();
        return null;
    }
}).when(mock).someMethod();

因此,如果您的方法是void类型,应使用以下代码:
MyObject spy = spy(myObject);

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

或者如果它不是空的:

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

抱歉,我没有写过它,但当然我使用了一个方法 when(spy.method()).thenAnswer(new Answer())。 - Moshe Tsabari
你的 method() 是 void 还是有返回值? - Virginie
这个答案救了我...我昨天就在苦苦挣扎,试图弄清楚为什么 when().then(answer); ... 会出问题...真是让人头疼...我只是尝试了 doAnswer().when(),它完美地解决了问题... - Hugo Allexis Cardona

6
在查看您的代码后,我发现问题出在使用spy时需要使用


doAnswer.(new Answer<T>() {..}).when(spy).method()

而不是!!!

when(spy.method()).thenAnswer(new Answer<T>() {..})

谢谢


1
请注意,我的方法带有参数 spy.method(arg)。 - Moshe Tsabari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接