Перед тестированием реализации Iterator вы должны рассмотреть, что является публичным API вашего класса.И покрыть контракты этого API.
В вашем случае у вас есть 2 открытых метода: hasNext()
, next()
.
Я хочу добавить, что для любой реализации итератора hasNext()
должно бытьидемпотентная.Результат должен быть одинаковым, даже если вы называете его 1, 10 или 100 раз.
Кроме того, вы должны подумать, как управлять своим тестовым классом.Какими должны быть тестовые данные, как вы должны получать к ним доступ из разных тестовых случаев и как освобождать ресурсы после выполнения тестов и т. Д.
Помните, что выполнение Junit не имеет строгой последовательности для выполнения тестов.
Может вызывать такие тесты, как
test1()
, test2()
, test3()
или
test2()
, test1()
...
Следовательно, вы не можете проверить next()
: в одном методе извлекается первый элемент из всех итераторов и в то же время делается то же самое для второго элемента из другого метода.
Вот пример некоторыхскелет для тестирования реализации вашего итератора:
private ImprovedAlternateIterator<Iterator> improvedIterator;
@Before
public void setUp() throws Exception {
ArrayList<String> list1 = Lists.newArrayList("A", "B", "C");
ArrayList<String> list2 = Lists.newArrayList("x", "y", "z");
ArrayList<Integer> list3 = Lists.newArrayList(1, 2);
ListIterator iterator1 = list1.listIterator();
ListIterator iterator2 = list2.listIterator();
ListIterator iterator3 = list3.listIterator();
improvedIterator = new ImprovedAlternateIterator<Iterator>(iterator1, iterator2, iterator3);
}
@After
public void tearDown() throws Exception {
improvedIterator = null;
}
/**
* check that hasNext() is idempotent -> even if you call it 1 or 10 times the result should be the same
*/
@Test
public void testHasNextForAlternateIterator() {
for (int i = 0; i < 20; i++) {
assertTrue(improvedIterator.hasNext());
}
}
/**
* check that next() for iterator
* it should return first element per each iterator
*/
@Test
public void testNextForAlternateIterator() {
String expectedFromFirstIterator = "A";
String expectedFromSecondIterator = "x";
int expectedFromThirdIterator = 1;
assertEquals(expectedFromFirstIterator, improvedIterator.next());
assertEquals(expectedFromSecondIterator, improvedIterator.next());
assertEquals(expectedFromThirdIterator, improvedIterator.next());
String expected2FromFirstIterator = "B";
String expected2FromSecondIterator = "y";
int expected2FromThirdIterator = 2;
assertEquals(expected2FromFirstIterator, improvedIterator.next());
assertEquals(expected2FromSecondIterator, improvedIterator.next());
assertEquals(expected2FromThirdIterator, improvedIterator.next());
// you can omit following section if you don't need to cover it
String expected3FromFirstIterator = "C";
String expected3FromSecondIterator = "z";
assertEquals(expected3FromFirstIterator, improvedIterator.next());
assertEquals(expected3FromSecondIterator, improvedIterator.next());
}
Очень полезно добавить несколько информативных сообщений, если тест не пройден:
assertEquals ("Первый элемент из первого итератора не получен", ожидаемый, фактический);
Также рассмотрим отрицательные случаи, когда вы извлекали все элементы из вашего итератора или он пуст.Что именно должно быть возвращено?Некоторое исключение или значение по умолчанию.Вы можете добавить случаи для их покрытия.