根据 Mockito 的文档,接受的答案不是间谍真实对象的正确方法。
正确的方法是使用以下模式:
doReturn("foo").when(spy).get(0);
您可以在下面找到 Mockito 关于 Spy on real objects的片段。
监视真实物体的重要问题!
有时使用 when(Object) 来存根间谍是不可能或不切实际的。因此,当使用间谍时,请考虑 doReturn|Answer|Throw() 系列方法进行存根。例子:
List list = new LinkedList();
List spy = spy(list);
//Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");
//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
Mockito不会将调用委托给传递的真实实例,而是实际创建它的副本。因此,如果您保留真实实例并与之交互,请不要期望间谍知道这些交互及其对真实实例状态的影响。推论是,当在 spy而不是在真实实例上调用未存根的方法时,您不会看到对真实实例的任何影响。注意最终方法。Mockito 不模拟最终方法,因此底线是:当您监视真实对象时+您尝试存根最终方法=麻烦。您也将无法验证这些方法。