繁体   English   中英

Mockito间谍怎么知道是什么时候进行间谍活动?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM