当前位置: 首页 > 知识库问答 >
问题:

一个假人间谍是如何知道自己什么时候在间谍?

庄康胜
2023-03-14

文档中的这段代码完全让我感到困惑:

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");

我明白了,摩基托很奇怪而且几乎不在Java。令人困惑的是spy.*必须充分评估才能知道它是否被包装在when()或其他文件中。第一个spy.*方法为什么不调用实际对象,而后面的方法却调用了?

共有2个答案

宗政和韵
2023-03-14

我不知道具体的实现方式,但我可以猜测一下。

spy(...)的调用首先代理给定对象,并将其作为委托调用的引用。

呼叫

when(spy.size()).thenReturn(100);

实际上相当于

Integer result = spy.size();
OngoingStubbing<Integer> stubbing = when(result); // result is useless
stubbing.thenReturn(100);

size()的第一个调用是在代理上调用的。在内部,它可以注册调用,例如将其推送到静态(全局)Mockito堆栈上。然后,当您调用When()时,Mockito将从堆栈中弹出,将对size()的调用识别为需要截尾,并执行这样做所需的任何逻辑。

这可以解释为什么在多线程环境中挂断是一种糟糕的业务。

欧阳俊逸
2023-03-14

根据文档,第一个when(spy.size()).thenreturn(100)将实际调用真正的list.size()方法,请参见:http://mockito.github.io/mockito/docs/current/org/mockito/mockito.html#13

当然,随后的每个调用都将返回模拟结果。

如果您不希望调用真正的方法(例如when(spy.get(0)).ThenReturn(...)可能会引发IndexOutOfBoundsException,则必须使用以下模式:doReturn(...).when(spy).get(0);

 类似资料:
  • 所以我有一个调用https请求的方法。我已经成功地在其他测试中中断了调用,但是这个测试打败了我,因为它根本不起作用。 在我的beforeach中,我创建存根,在我的afterEach中,我执行存根还原 在测试中,我创建了四个存根调用。

  • 问题内容: 我有内部类的课程,如下所示: 模仿测试如下所示:build.gradle: 测试: 第一次测试正在按预期方式工作。第二个永远不会被检测为“已调用”,尽管在日志中我看到的是。有什么问题吗?:) 谢谢! 问题答案: 怎么了? 好吧,这里的问题非常微妙,当您调用时,会在实例背后创建某种装饰器,以允许监视实例上的所有方法调用。因此,您可以检查给定方法被调用了多少次, 但是在装饰器 上 却 没有

  • 我有一个代码,它在其中移动,生长,生成食物,最后一个问题是,如果蛇咬了自己怎么办。 查找RAK: rak之后有一部分代码扫描光标位置的字符。当蛇的头撞到食物时,它就会发出这个密码。游戏结束了。我想知道为什么, 该代码中的坐标总是存储在数组中,可以检查头坐标是否等于存储在数组中的坐标。循环的极限应该在snake_length附近

  • 我试图理解西农图书馆的假、间谍、存根和模拟之间的区别,但无法清楚地理解。 有人能帮我了解一下吗?

  • 所以我有点理解java类加载器是什么,因为它为JVM准备编译的.class文件。我几乎不理解它是如何工作的,因为它试图通过一系列递归调用父类加载器的步骤来加载一个类。我没有理解的是类加载器是如何确定的。也就是说,如何为类选择类加载器? 我现在问这个问题是因为我基本上遇到了以下问题:我无法将子类强制转换到实现的接口。 该类如下所示: 这是我的(略经编辑的)stacktraces的结尾: 这里,Acc

  • 问题内容: 我正在寻找我的Linux内核的时间片(或量子)的值。 具体问题: 是否存在公开此类信息的文件? (或者)在我的发行版的Linux标头中是否定义明确? (或者)是否存在公开此值的Linux API的C函数(也许是sysinfo)? 问题答案: 分配给特定过程的数量可能有所不同: 您可以通过调整 sched_latency_ns 和 sched_min_granularity_ns 来调整