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

Mockitio - returning null when expecting mock in unit test

我在 class 中有一个名为 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。

任何人都可以发现为什么我得到 null 的问题吗?

您对 fruitBasket.getFruit("Apple"); 的调用导致对 FruitDao 的调用尚未配置,以便了解预期的调用以及如何响应它们。我想 mockito 在不知道该怎么做时的默认行为是 return null 而不是抛出异常,所以你的 mocked FruitDao returns 是 null Fruit,并且你的测试失败了。

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

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

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