2015-02-14 3 views
0

У меня есть метод в классе под названием FruitBasket, который я хотел бы проверить, как так:Mockitio - возвращение нуля, когда ожидает издеваются в единичном испытании

// Method to test 
public Fruit getFruit(String fruitName) { 
    Fruit fruit = new Fruit(); 

    if(fruitExists(fruitName)) { 
     fruit = getFruitByName(fruitName); 
    } 
    else { 
     fruit.setFruitName(fruitName); 
     saveFruit(fruit); 
     fruit = getFruitByName(fruitName); 
    } 

    return fruit; 
} 



private Fruit getFruitByName(String fruitName) { 
    return fruitDao.getFruitByName(fruitName); 
} 

public boolean fruitExists(String fruitName) { 
    return fruitDao.fruitExists(fruitName); 
} 

я написал модульное тестирование этого метода следующим образом:

@Mock 
FruitDao fruitDao; 
@Mock 
Fruit mockFruit; 

@Before 
public void setUp() { 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void testgetFruitMethod() { 
    FruitBasket fruitBasket = new FruitBasket (fruitDao); 
    Fruit apple = fruitBasket.getFruit("Apple"); 

    when(fruitDao.fruitExists(anyString())).thenReturn(true); 
    when(fruitDao.getFruitByName(anyString())).thenReturn(mockFruit); 

    assertThat(apple, instanceOf(Fruit.class)); 
} 

Однако испытание не выполняется с ошибкой утверждения. Был вызван экземпляр Fruit, но вместо него был возвращен нуль.

Может ли кто-нибудь выявить проблему, почему я получаю null?

+0

Как 'apple' будет зависеть от вашего' when' заявления? –

+0

Что делает конструктор 'FruitBasket'? – fge

ответ

3

Ваш вызов fruitBasket.getFruit("Apple"); приводит к вызовам FruitDao, которые еще не настроены, чтобы знать, какие вызовы ожидать и как реагировать на них. Я полагаю, что поведение mockito по умолчанию, когда он не знает, что делать, - это просто вернуть значение null вместо того, чтобы выбрасывать исключение, поэтому ваше издеваемое FruitDao возвращает нуль Fruit, и ваш тест взрывается.

Таким образом, вы должны сначала сделать ваши when() с, а затем вызвать Fruit apple = fruitBasket.getFruit("Apple");

+1

«Я полагаю, что поведение mockito по умолчанию, когда он не знает, что делать, - просто вернуть null» <- ваше предположение верно, но точнее, Mockito использует только значения по умолчанию, указанные JLS, когда вы не предоставляете никаких ; и значение по умолчанию для любого 'Object' равно' null' (и 0 для числовых примитивов и 'false' для booleans) – fge

+0

Спасибо за это! Я не могу поверить, что сделал эту ошибку, у меня есть модульные тесты в другом месте в моей базе кода, где операторы 'if()' правильно расположены. Просто глупая ошибка с моей стороны, которую я забыл! – user2844485

+0

Не беспокойтесь об этом; это случается даже с лучшими из нас. –

2

Try подготовить макет, прежде чем использовать его:

@Test 
public void testgetFruitMethod() { 
    // given 
    when(fruitDao.fruitExists(anyString())).thenReturn(true); 
    when(fruitDao.getFruitByName(anyString())).thenReturn(mockFruit); 
    FruitBasket fruitBasket = new FruitBasket (fruitDao); 

    // when 
    Fruit apple = fruitBasket.getFruit("Apple"); 

    // then 
    assertThat(apple, instanceOf(Fruit.class)); 
} 
+0

Спасибо за это, я также согласился бы на это как на правильный ответ, но другой ответ опубликовал также правильно и был опубликован за несколько секунд до вашего. – user2844485

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