Как смоделировать метод в том же классе, который возвращает Iterator в Java - PullRequest
1 голос
/ 27 марта 2019

Я пытаюсь выполнить модульное тестирование метода getFruitItemMap(), который вызывает другой метод getAllItemsBelongingToFruit с типом возвращаемого значения Iterator в том же классе. Я пытаюсь смоделировать этот метод, используя Mockito.spy(), но не знаю, как вернуть итератор. Я проверил другие ответы на переполнение стека здесь , но похоже, что я что-то здесь упускаю.

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 и Unit Testing, я пытаюсь разобраться в этом. Я не уверен, как заставить mockito возвращать итератор Mockito.doReturn() в этом случае.

1 Ответ

1 голос
/ 27 марта 2019

Самый простой способ - получить коллекцию соответствующих Fruit объектов и вернуть из нее Iterator.В вашем случае вы можете просто вернуть итератор из fruitItemMap values(), который вы используете в своем тесте:

@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());
}
...