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.
您好,我有一个 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.