从那个返回iterator返回mockito

lea*_*ner 5 java mockito

嗨,我有一个课程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();
    }
});
Run Code Online (Sandbox Code Playgroud)

第二种方式:

A source = mock(A.class);
final List<String> documents = getList();
when(source.iterator()).thenReturn(getList().iterator());
Run Code Online (Sandbox Code Playgroud)

第一种方法Iterator在每次调用时返回一个新的,source.iterator()但第二种方法返回相同的Iterator对象.因此,如果我使用第二种方式来存根源对象,我会在后续调用中获得一个空迭代器source.iterator().

为什么会这样?Mock不应该Iterator在每次通话时都返回新的source.iterator()

Mur*_*nik 8

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

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

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