У меня есть один сценарий, который мне нужно проверить, используя 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