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 ответов:
Вы могли бы использовать
when(myMock.doSomething(eq("some string"), argThat(new IsIteratorOfList(aList))))Где
Сопоставитель может быть еще проще и просто проверить первый элемент, или количество элементов, или все, что вы хотите.IsIteratorOfList- подкласс ArgumentMatcher, который проверяет, что при добавлении всех элементов данного итератора в новый список этот новый список равен списку, переданному в конструкторе (aListв данном случае).
Я реализовал
IterableMatcher<T>. Это включает в себя статический методelemEq, который создаст один из них для вас.Например:
doReturn(result).when(mock).method(elemEq(expected));
Comments