gpt4 book ai didi

java - 从 thenReturn mockito 返回迭代器

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:17 25 4
gpt4 key购买 nike

您好,我有一个类 A 实现了 Iterable。我有这个代码来 stub 这个类的对象:

第一种方式:

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

第一种方法在每次调用 source.iterator() 时返回一个新的 Iterator,但第二种方法返回相同的 Iterator 对象。因此,如果我使用第二种方法 stub 源对象,我将在随后调用 source.iterator() 时得到一个空迭代器。

为什么会这样? Mock 不应该在每次调用 source.iterator() 时返回一个新的 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 有一个对象传递给它,它在内部存储,并在需要时返回。它无法“记住”此对象是通过调用函数生成的,除非它具有执行它的实际代码 - 例如,就像您在第一个片段中所做的那样。

关于java - 从 thenReturn mockito 返回迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27818891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com