2013-02-13 1 views
1
  • Я использую Mockito в тесте в JUnit. Я издевался над NavigableSet.
  • В моем модульном тесте в какой-то момент мне нужно зациклиться на объектах, содержащихся в этом документе NavigableSet.
  • Я планировал это NavigableSet для целей тестирования содержать только 1 объект.

Ниже приведен код, который я использовал с Mockito для создания фиктивного объекта:Mockito дает бесконечен, а петлю и конечно для петель на одной и тот же NavigationSet

NavigableSet<ObjectToProcess> newMockedSet = new TreeSet<ObjectToProcess>(); 
ObjectToProcess mockedInnerObject = new ObjectToProcess(); // initialization of this object 
newMockedSet.add(mockedInnerObject); // I just added the only 1 object contained in the NavigableSet 
Mockito.when(getSetOfObjectToProcess()).thenReturn(newMockedSet); 

Почему следующий while цикл дает бесконечный цикл с NavigableSet, содержащий только один объект?

NavigableSet<ObjectToProcess> anotherSetOfObjects = getSetOfObjectToProcess(); // retrieving the mocked object 
while (anotherSetOfObjects.iterator().hasNext()) 
{ 
    ObjectToProcess thisPaymentDemand = anotherSetOfObjects.iterator().next(); 
    // do stuff 
} 

Почему следующий for петля ведет себя, как ожидается, зацикливание только один раз?

NavigableSet<ObjectToProcess> anotherSetOfObjects = getSetOfObjectToProcess(); // retrieving the mocked object 
for (ObjectToProcess thisMockedInnerObject : anotherSetOfObjects) 
{ 
    ObjectToProcess thisPaymentDemand = thisMockedInnerObject; 
    // do stuff 
} 

ответ

3

Это не проблема Mockito.

В в то время как например вы звоните anotherSetOfObjects.iterator() в начале вашего цикла на КАЖДЫЙ итерации.

Вы получаете итератор (для mockedSet, который содержит один элемент), затем проверяя, имеет ли он следующий (он делает), а затем вводит тело вашего цикла. После того, как тело завершается, вы снова запускаете условную проверку, чтобы увидеть, нужно ли цитировать ..., получив итератор NEW , который функционирует точно так же, как и первый (если вы не изменили набор в То время).

магазин итератор вне цикла таким образом вы проверяете тот же итератор на каждой итерации, а не получать новую:

Iterator<NavigableSet> iterator = anotherSetOfObjects.iterator(); 
while (iterator.hasNext()) 
{ 
    ObjectToProcess thisPaymentDemand = anotherSetOfObjects.iterator().next(); 
    // do stuff 
} 

Делать это сделает ваше время цикла ведут себя, как ваш для контура делает.

1

Трудно понять ваше намерение от отправленного кода. Вам нужно продемонстрировать создание макетного объекта некоторого типа сопутствующего класса и идентичность тестируемого вами класса. Кроме того, аргумент вызова when() должен иметь форму вызова метода в Mockito mock. Другими словами,

// setting up test fixture 
MyCollaborator x = Mockito.mock(MyCollaborator.class); 
when(x.getSetOfObjectToProcess()).thenReturn(newMockedSet); 

// and then later in test 
NavigableSet<ObjectToProcess> anotherSetOfObjects = x.getSetOfObjectToProcess(); 
while(anotherSetOfObjects.iterator() ...) { 

// or 
for (ObjectToProcess thisMockedInnerObject : anotherSetOfObjects) { 
... 

Таким образом, вы пропускаете x. часть when() аргумента.

Что является менее ясным, так это ваше намерение в первую очередь. Если вы пытаетесь протестировать метод getSetOfObjectToProcess() на каком-то классе, то вы не должны издеваться над этим классом. Вы должны быть только издевательскими классами/объектами-соавторами, которые взаимодействуют с классом, который вы тестируете (часто называемым «System Under Test» или SUT).

Ваш код даже не показывает создание макетного объекта Mockito с использованием метода Mockito.mock() или аннотации @Mock, и по крайней мере один из них необходим для использования Mockito.И если getSetOfObjectToProcess() является статическим методом, то Mockito не будет издеваться над ним за вас.