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));
}
我在 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));
}