2012-01-13 2 views
2

У меня есть метод, который принимать строку и итератор:Mockito: как ожидать, что итератор будет равен?

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

, но тогда, конечно, я не могу установить разные результаты, отд заканчивающийся на том, что есть в итераторе ...

+0

могли бы вы предоставить образец кода, который вы хотите сделать, чтобы работать. – kan

ответ

1

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

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

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

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

+0

это работает хорошо, но только в случае, когда на макет есть только один матчи (это, к сожалению, не упоминалось в моем вопросе): если у вас есть два или более матчи, и, например, первый совпадёт, итератор тестируется через и считает, что это не соответствует - любой последующий соединитель получит уже «использованный» итератор, который не может быть запущен снова, поэтому все они больше не могут его тестировать, и это было бы неправильно ... – Laimoncijus

+0

Да, действительно. Рассмотрим рефакторинг кода и сделайте сборку как аргумент, а не Итератором. –

+0

Привет, просто читаемый совет, напишите свой код как «когда (myMock.doSomething (eq (« some string »), isIteratorOf (aList))) и где-то в вашем тесте или в каком-либо тесте DIY используйте класс wite mehtod like' Итератор isIteratorOf (Список списков) {return argThat (новый IsIteratorOfList (список)); } '. Плюс я согласен с @JBNizet, если вам действительно не нужно потреблять итератор, вы должны обязательно подумать о рефакторе, чтобы вместо этого принять «Итерируемый». – Brice

0

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

Смежные вопросы