【问题标题】:How to mock method in the same class that returns an Iterator in java如何在Java中返回Iterator的同一类中模拟方法
【发布时间】:2019-03-27 07:18:36
【问题描述】:

我正在尝试对一个方法getFruitItemMap() 进行单元测试,该方法在同一类中调用另一个方法getAllItemsBelongingToFruit,其返回类型为Iterator。我正在尝试使用Mockito.spy() 模拟此方法,但不确定如何返回迭代器。我在stack overflow here 上查看了其他答案,但看起来我在这里遗漏了一些东西。

class FruitItemImpl {

Map<String, Fruit> getFruitItemMap() {
        Map<String, Fruit> fruitMap = new HashMap<>();
        Iterator<Fruit> items = getAllItemsBelongingToFruit("Apple");

while (items.hasNext()) {
            Fruit fruitItem = items.next();
            fruitMap.put(fruitItem.getID(), fruitItem);
        }
        return fruitMap;
    }

public Iterator<Fruit> getAllItemsBelongingToFruit(String fruit) {
      //some logic that returns an iterator
}

这是单元测试:

    @Test
    public void testGetFruitItemMap() {
        Map<String, Fruit> fruitItemMap = new HashMap<>();
        FruitItemImpl doa1 = Mockito.spy(dao);
   Mockito.doReturn(**new Iterator<Fruit>**).when(doa1).getAllItemsBelongingToFruit("Apple") //Here
        Assert.assertEquals(fruitItemMap.size(), doa1.getFruitItemMap().size());
    }

由于我是 Mockito 和单元测试世界的新手,因此我试图了解它。在这种情况下,我不确定如何让 mockito 返回一个迭代器 Mockito.doReturn()

【问题讨论】:

    标签: java unit-testing mocking mockito


    【解决方案1】:

    最简单的方法是收集适当的Fruit 对象,并从中返回Iterator。在您的情况下,您可以从您在测试中使用的fruitItemMapvalues() 返回一个迭代器:

    @Test
    public void testGetFruitItemMap() {
        Map<String, Fruit> fruitItemMap = new HashMap<>();
        FruitItemImpl doa1 = Mockito.spy(dao);
        Mockito.doReturn(fruitItemMap.values().iterator()) // Here!
               .when(doa1).getAllItemsBelongingToApple("Apple");
        Assert.assertEquals(fruitItemMap.size(), doa1.getFruitItemMap().size());
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 1970-01-01
      • 2015-11-28
      • 2014-11-28
      • 2018-01-09
      • 2010-10-30
      • 2014-04-08
      • 2017-01-05
      • 1970-01-01
      相关资源
      最近更新 更多