Mockito:如何期待迭代器是平等的?

时间:2012-01-13 11:51:58

标签: java iterator mockito

我有一个接受字符串和迭代器的方法:

public int doSomething(String str, Iterator<String> itr)

我正在尝试模拟一个类,这个方法是,所以它会返回我的整数,这取决于传递的参数。我如何调用Mockito的when(),以便它希望传递的迭代器与我指定的迭代器“相等”?由于传递的迭代器是在系统中动态构建的,我不能在when()中使用相同的实例,所以我只能将它的副本作为我的期望:

List<String> aList = new ArrayList<String>();
aList.add("one");
aList.add("two");

MyClass myMock = Mockito.mock(MyClass.class);

我试过以下,但似乎都没有效果:

Mockito.when(myMock.doSomething("some string", aList.iterator())).thenReturn(10);
Mockito.when(myMock.doSomething(Matchers.eq("some string"), Matchers.eq(aList.iterator()))).thenReturn(10);

我只使用anyObject()

成功了
Mockito.when(myMock.doSomething(Matchers.eq("some string"), Matchers.anyObject())).thenReturn(10);

但当然我无法设置不同的结果,具体取决于迭代器中的内容......

3 个答案:

答案 0 :(得分:1)

您可以使用

when(myMock.doSomething(eq("some string"), argThat(new IsIteratorOfList(aList))))

其中IsIteratorOfListArgumentMatcher的子类,它检查当给定的迭代器元素都被添加到新列表时,这个新列表等于构造函数中传递的列表({{1}在这种情况下)。

匹配器可以更简单,只需检查第一个元素,元素数量或任何你想要的东西。

答案 1 :(得分:1)

我已经实施了IterableMatcher<T>。这包括一个静态方法elemEq,它将为您创建其中一个。

例如:

doReturn(result).when(mock).method(elemEq(expected));

https://gist.github.com/collinsauve/1fcf924cdcced40e0bee

答案 2 :(得分:0)

您始终可以自己实现Iterator界面。