您好我有一个A
课程正在实施Iterable
。
我有这个代码来存根这个类的对象:
第一种方式:
A source = mock(A.class);
final List<String> documents = getList();
when(source.iterator()).thenAnswer(new Answer<Iterator<String>>() {
@Override
public Iterator<String> answer(final InvocationOnMock invocation) throws Throwable {
return documents.iterator();
}
});
第二种方式:
A source = mock(A.class);
final List<String> documents = getList();
when(source.iterator()).thenReturn(getList().iterator());
第一种方法在每次调用Iterator
时返回一个新source.iterator()
,但第二种方法返回相同的Iterator
对象。因此,如果我使用第二种方法来存根源对象,我会在后续调用source.iterator()
时得到一个空的迭代器。
为什么会这样? Mock不应该在每次调用Iterator
时返回新的source.iterator()
吗?
答案 0 :(得分:7)
内联代码有时会令人困惑。让我们打开第二段代码:
A source = mock(A.class);
final List<String> documents = getList();
final Iterator<String> iter = getList().iterator()
when(source.iterator()).thenReturn(iter);
现在,它更容易理解。始终返回相同的iter
对象,因此它保留了它的状态。事实上,在mockito上面的更改之前,括号中的函数调用是无关紧要的 - mockito有一个传递给它的对象,它在内部存储,并在需要时返回。它不能记得&#34;该对象是通过调用函数生成的,除非它具有执行它的实际代码 - 例如,就像你在第一个代码片段中所做的那样。
答案 1 :(得分:0)
作为Mureinik所说的补充,这种行为实际上是当 Mockito方法时的正常行为。来自Mockito doc:
一旦存根,该方法将始终返回存根值,无论如何 被调用的次数。