return 来自 thenReturn mockito 的迭代器

return iterator from thenReturn mockito

您好,我有一个 class A 实现 Iterable。 我有这个代码来存根这个 class:

的对象

第一种方式:

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

第一种方式 return 在每次调用 source.iterator() 时都是一个新的 Iterator,但第二种方式 return 是同一个 Iterator 对象。因此,如果我使用第二种方法来存根源对象,我会在后续调用 source.iterator().

时得到一个空迭代器

为什么会这样?不应该在每次调用 source.iterator() 时模拟 return 一个新的 Iterator 吗?

内联代码有时会令人困惑。让我们打开第二个代码块:

A source = mock(A.class);
final List<String> documents = getList();
final Iterator<String> iter = getList().iterator()
when(source.iterator()).thenReturn(iter);

现在,更容易理解了。始终返回相同的 iter 对象,因此它保留其状态。在上面的更改之前,mockito 在括号中有一个函数调用这一事实是无关紧要的——mockito 有一个传递给它的对象,它在内部存储,并在需要时 returns 。它不能 "remember" 这个对象是通过调用函数生成的,除非它有实际的代码来执行它 - 例如,就像你在第一个片段中所做的那样。

作为 Mureinik 所说的补充,此行为实际上是 when Mockito 方法的正常行为。来自 Mockito doc:

Once stubbed, the method will always return stubbed value regardless of how many times it is called.