繁体   English   中英

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

[英]Mockitio - returning null when expecting mock in unit test

我在一个名为FruitBasket的类中有一个方法, 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。

谁能发现我为什么会空的问题?

您对fruitBasket.getFruit("Apple");调用fruitBasket.getFruit("Apple"); 会导致尚未配置的FruitDao调用,从而知道期望什么调用以及如何响应它们。 我猜想mockito的默认行为是在没有线索的情况下只是返回null而不是抛出异常,因此您嘲笑的FruitDao返回null Fruit ,并且测试FruitDao

因此,您需要先执行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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM