文档中的这段代码完全让我感到困惑:
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.*
方法为什么不调用实际对象,而后面的方法却调用了?
我不知道具体的实现方式,但我可以猜测一下。
对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()
的调用识别为需要截尾,并执行这样做所需的任何逻辑。
这可以解释为什么在多线程环境中挂断是一种糟糕的业务。
根据文档,第一个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 来调整