我有一个接受字符串和迭代器的方法:
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);
但当然我无法设置不同的结果,具体取决于迭代器中的内容......
答案 0 :(得分:1)
您可以使用
when(myMock.doSomething(eq("some string"), argThat(new IsIteratorOfList(aList))))
其中IsIteratorOfList
是ArgumentMatcher的子类,它检查当给定的迭代器元素都被添加到新列表时,这个新列表等于构造函数中传递的列表({{1}在这种情况下)。
匹配器可以更简单,只需检查第一个元素,元素数量或任何你想要的东西。
答案 1 :(得分:1)
我已经实施了IterableMatcher<T>
。这包括一个静态方法elemEq
,它将为您创建其中一个。
例如:
doReturn(result).when(mock).method(elemEq(expected));
答案 2 :(得分:0)
您始终可以自己实现Iterator
界面。