模拟一个返回带有捕获泛型的迭代器的方法

时间:2017-03-02 17:12:13

标签: java generics mockito

我使用的第三方库有以下形式的方法:

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()作为参数,则编译器不会抱怨,但我无法访问迭代器来覆盖它的方法。

如何以这样的方式模拟这个迭代器,我可以将它用作模拟并覆盖它的方法?

1 个答案:

答案 0 :(得分:1)

我将此标记为this question的副本,因为我找到了使其正常工作的方法。

为了参考起见,我最终做的是构建一个虚拟列表&lt;&gt;并返回它的迭代器。如果您使用Option语法,则此方法有效。

我发现工作的另一种机制是将通用迭代器转换为普通迭代器,但这会引发有关未经检查的异常的警告。