【问题标题】:Mockitio - returning null when expecting mock in unit testMockito - 在单元测试中期望模拟时返回 null
【发布时间】:2015-02-14 19:59:44
【问题描述】:

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

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

【问题讨论】:

  • apple 将如何受到您的 when 语句的影响?
  • FruitBasket的构造函数是做什么的?

标签: java unit-testing mocking mockito


【解决方案1】:

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

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

【讨论】:

  • “我想mockito在不知道该怎么做时的默认行为就是返回null” Object 的默认值为null(数字基元为0,布尔值false
  • 谢谢!我不敢相信我犯了这个错误,我在代码库的其他地方进行了单元测试,when() 语句的位置正确。只是我忽略了一个愚蠢的错误!
  • 别担心;它甚至发生在我们最好的人身上。
【解决方案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));
}

【讨论】:

  • 谢谢你,我也接受这个作为正确答案,但发布的另一个答案也是正确的,并且比你早几秒发布。
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多