Mockito - 在单元测试中期待模拟时返回null

时间:2015-02-14 11:49:15

标签: java unit-testing mocking mockito

我在一个名为FruitBasket的类中有一个方法,我想测试它:

// 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。

任何人都可以发现我为什么会变空的问题吗?

2 个答案:

答案 0 :(得分:3)

您对fruitBasket.getFruit("Apple");的调用会导致调用尚未配置的FruitDao,以便了解所期望的调用以及如何响应这些调用。我认为mockito的默认行为在它不知道该做什么时只返回null而不是抛出异常,因此你的模拟FruitDao返回null Fruit,你的测试就会爆炸。

因此,您需要先执行when() s然后调用Fruit apple = fruitBasket.getFruit("Apple");

答案 1 :(得分:2)

在使用之前尝试准备模拟:

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