Невозможно внедрить класс реализации Iterator в JMockit - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть один сценарий, который мне нужно проверить, используя TestNg и JMockit. У меня есть эти примеры классов для иллюстрации случая.

public class Service {

    private Dao dao;

    public String fetch() {
        List<String> items = new ArrayList<>();
        ResultIterator iterator = dao.fetch();
        while (iterator.hasNext()) {
            String string = iterator.next();
            items.add(string);
        }
        return String.join(", ", items);
    }
}

В классе обслуживания мне нужно ввести зависимость Dao.

    public class Dao {

    public ResultIterator fetch() {
        List<String> data = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
        return new ResultIterator(data);
    }
}

Класс Dao извлекает данные из бэкэнда и дает экземпляр класса ResultIterator.

public class ResultIterator implements Iterator<String> {

    private int index = 0;
    private List<String> data;

    public ResultIterator(List<String> data) {
        this.data = data;
    }

    @Override
    public boolean hasNext() {
        return index < data.size();
    }

    @Override
    public String next() {
        String res = data.get(index);
        index++;
        return res;
    }

}

Для запуска теста

public class NGTest {

    @Tested(fullyInitialized = true)
    Service service;

    @Injectable
    Dao dao;

    @Test
    public void testFetchedData() throws Exception {
        List<String> data = new ArrayList<>(Arrays.asList("E", "F", "G", "H"));
        new Expectations() {
            {
                dao.fetch();
                result = new ResultIterator(data);
            }
        };
        String out = service.fetch();
        System.out.println(out);
    }
}

Когда я запускаю тестовый пример, я получаю ошибку java.lang.IllegalArgumentException: java.util.Iterator is not mockable. Здесь я не хочу издеваться над итератором. Я просто хочу передать его как результат в блоке ожиданий. Я использую TestNg 6.8 и JMockit 1.46

...