我在一个名为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。
任何人都可以发现我为什么会变空的问题吗?
答案 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));
}