我使用的第三方库有以下形式的方法:
public interface ThirdPartyMessageThing<T> {
Iterator<? extends MessageEntry<T>> getMessages(){}
}
我试图模拟对getMessages()的调用以返回一个模拟的迭代器,以便我可以使用Mockito控制hasNext()
和next()
的行为。
我有一个名为ThirdPartyMessageThing<String>
的模拟thirdPartyMessageThing
对象。
如果我试图像这样模拟迭代器:
Iterator<MessageEntry<String>> mockedIterator = Mockito.mock(Iterator.class);
模拟似乎没问题,直到我尝试将其作为模拟从when()
调用返回到:{/ p>
when(thirdPartyMessageThing.getMessages()).thenReturn(mockedIterator);
编译器并不喜欢这样说它无法解决该方法。
如果我使用IDE的自动完成功能从调用我试图模拟的方法生成局部变量,我会得到相同的行为:
Iterator<? extends MessageEntry<String>> mockedIterator =
thirdPartyMessageThing.getMessages();
并尝试将其用作thenReturn()
的参数。
但是,如果我只是将mock(Iterator.class)
放入thenReturn()
作为参数,则编译器不会抱怨,但我无法访问迭代器来覆盖它的方法。
如何以这样的方式模拟这个迭代器,我可以将它用作模拟并覆盖它的方法?
答案 0 :(得分:1)
我将此标记为this question的副本,因为我找到了使其正常工作的方法。
为了参考起见,我最终做的是构建一个虚拟列表&lt;&gt;并返回它的迭代器。如果您使用Option
语法,则此方法有效。
我发现工作的另一种机制是将通用迭代器转换为普通迭代器,但这会引发有关未经检查的异常的警告。