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);


Но тогда, конечно, я не могу установить различные результаты, в зависимости от того, что находится в итераторе...
557   3  

3 ответов:

Вы могли бы использовать

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

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

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

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

Например:

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

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

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

Comments

    Ничего не найдено.