![](/img/trans.png)
[英]Mockito spy - when calling inner class method not spying method in spy object
[英]How does a Mockito spy know when it is spying?
文档中的这段代码让我很困惑:
List list = new LinkedList();
List spy = spy(list);
when(spy.size()).thenReturn(100); // <--- how does this spy know
// not to call the real method????
//using the spy calls *real* methods
spy.add("one");
spy.add("two");
我明白了,Mockito很奇怪,而且几乎不使用Java。 令人困惑的事情是spy.*
必须先进行全面评估,然后才能知道它是否包装在when()
或其他内容中。 到底第一个spy.*
方法不会调用真实对象,而随后的对象会如何调用呢?
根据文档,第一个when(spy.size()).thenReturn(100)
实际上会调用真正的List.size()
方法,请参见: http : List.size()
/mockito/Mockito.html#13
然后,每次后续调用都将返回模拟结果。
如果您不希望调用真实方法(例如, when(spy.get(0)).thenReturn(...)
可能会抛出IndexOutOfBoundsException
,则必须使用以下模式: doReturn(...).when(spy).get(0);
我不知道确切的实现方式,但我可以猜测。
对spy(...)
的调用首先代理给定对象,并将其保留为对委托调用的引用。
通话
when(spy.size()).thenReturn(100);
实际上相当于
Integer result = spy.size();
OngoingStubbing<Integer> stubbing = when(result); // result is useless
stubbing.thenReturn(100);
对size()
的第一次调用是在代理上调用的。 在内部,它可以注册呼叫,例如在static
(全局)Mockito堆栈上推送该呼叫。 然后,当您调用when()
,Mockito从堆栈中弹出,将对size()
的调用识别为需要存根,并执行所需的任何逻辑。
这可以解释为什么在多线程环境中进行存根是不好的生意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.