Mockito: как ожидать, что итератор будет равным? - PullRequest
2 голосов
/ 13 января 2012

У меня есть метод, который принимает строку и итератор:

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

Я пытаюсь смоделировать класс, где находится этот метод, чтобы он возвращал мне целое число, в зависимости от переданных аргументов.Как я могу вызвать when() в Mockito, чтобы он ожидал, что переданный итератор будет "равным" указанному мною?Поскольку переданный итератор где-то динамически создается в системе, я не могу использовать тот же его экземпляр в 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 ]

1 голос
/ 13 января 2012

Вы можете использовать

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

, где IsIteratorOfList - это подкласс ArgumentMatcher , который проверяет, что, когда все заданные элементы итератора добавляются в новый список, этот новый список равен списку, переданному в конструкторе (aList в это дело).

Сопоставление может быть еще проще и просто проверить первый элемент, или количество элементов, или все, что вы хотите.

1 голос
/ 24 января 2015

Я реализовал IterableMatcher<T>.Это включает статический метод elemEq, который создаст один из них для вас.

Например:

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

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

0 голосов
/ 13 января 2012

Вы всегда можете сделать собственную реализацию интерфейса Iterator.

...