2015-07-31 2 views
0

У меня есть единичный тест, который позволит мне проходить через объект Collection, содержащий список транспортных средств. На каждой итерации я хочу проверить, является ли автомобиль примером автомобиля. Так что мой код выглядит как это:Единичное тестирование Коллекция в Java

public class VehicleChecker { 
    protected boolean checkVehicles(Garage garage) { 
     for (Vehicle vehicle : garage.getVehicles() { 
      if (vehicle instanceof Automobile) return true; 
     } 
    } 
} 

Так я написал код соответственно:

@Mock private Garage mockGarage; 
@Mock private VehicleCollection mockVehicleCollection; 
@Mock private VehicleCollectionIterator mockVehicleCollectionIterator; 
@Mock private Vehicle mockVehicle; 

@Test 
public void testCheckVehicles() { 

    VehicleChecker testObject = new vehicleChecker(); 

    when(mockGarage.getVehicles()).thenReturn(mockVehicleCollection); 
    when(mockVehicleCollection.iterator()).thenReturn(mockVehicleCollectionIterator); 
    when(mockVehicleCollectionIterator.hasNext()).thenReturn(true).thenReturn(false); 
    when(mockVehicleCollectionIterator.next()).thenReturn(mockVehicle); 

    boolean result = testObject.checkVehicles(mockGarage); 

    verify(mockGarage).getVehicles(); 
} 

Проблема возникает с проверки заявления. Основываясь на том, как это было написано, тест должен пройти. Однако, когда я просматриваю код, я код полностью пропускает цикл for. Почему это? Есть ли разница в том, как одна итерация выполняется через коллекцию, а не ArrayList? Если да, то как я правильно издеваюсь над этим взаимодействием?

+2

Два вопроса: почему вы вручную проверяете тип? Это обычно плохой дизайн. И зачем издеваться над коллекцией, а не просто кормить ее реальной? – chrylis

+0

Я борюсь с конкретной версией этого кода, который не имеет типа возврата и не принимает аргументов. Это включает сборник. Лучшее, что я могу сделать, - издеваться над сборкой по прокси. Достаточно сказать, что я не могу накормить фактический объект Collection. –

+0

Просто попробовал все, работает, как ожидалось, в том смысле, что тест терпит неудачу, потому что вы издеваетесь над «Автомобилем», а не «Автомобилем». Хорошо, два небольших опечатка, но ничего, что IDE не будет выделять. Так странно, если это не работает для вас. –

ответ

0

Уверены ли вы, что вы инициализировали насмешки с помощью MockitoAnnotations.initMocks?

+0

Я положил Assert в основном по привычке. Однако я обязательно отредактирую это. Что касается проверки, я знаю, что я инициализировал все макетные объекты, которые мне нужны. Кроме того, не поддерживает ли @Mock аннотацию того же эффекта, что и Mockito.initmocks? –

+0

Неправильное имя в оригинальном ответе. Метод - MockitoAnnotations.initMocks. И да, он должен быть вызван из Javadoc: «Инициализирует объекты, аннотированные аннотацией Mock для данного testClass». – ghdalum

+0

Я не использовал метод Mockitoannotation.initMocks, но вместо этого работал '@RunWith (MockitoJUnitRunner)'. –

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