我创建了一个自定义迭代器,该迭代器在其构造函数中接受多个迭代器,并为使用三个迭代器构造的示例生成备用输出:
[a,b,c],[1,2]和[x,y,z]
迭代器应按此顺序生成元素
a,1,x,b,2,y,c,z
我的迭代器代码:
package alternate.iterator;
import java.util.Iterator;
/**Alternates on the given iterators.*/
public class ImprovedAlternateIterator<E> implements Iterator {
/**Stores the iterators which are to be alternated on.*/
private Iterator<E>[] iterators;
/**The index of iterator, which has the next element.*/
private int nextIterator = 0;
/**Initializes a new AlternatingIterator object.
* Stores the iterators in the iterators field.
* Finds the first iterator with an available element.*/
public ImprovedAlternateIterator(Iterator<E> ... iterators) {
this.iterators = iterators;
if (!iterators[0].hasNext())
findNextIterator();
}
@Override
public boolean hasNext() {
return iterators[nextIterator].hasNext();
}
@Override
public Object next() {
E element = iterators[nextIterator].next();
findNextIterator();
return element;
}
/**Steps on iterators, until one has next element.
* It does not step on them infinitely, stops when
* the lastly used iterator is reached.*/
private void findNextIterator() {
int currentIterator = nextIterator;
// Finding iterator with element remaining.
do {
stepNextIterator();
} while (!iterators[nextIterator].hasNext() && nextIterator != currentIterator);
// If it gets around to the same iterator, then there is no iterator with element.
}
/**Increases the nextIterator value without indexing out of bounds.*/
private void stepNextIterator() {
nextIterator = (nextIterator + 1) % iterators.length;
}
}
主班:
package alternate.iterator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.ListIterator;
public class MainApplication {
public static <E> void main(String[] args) {
ArrayList<String> list1 = new ArrayList<String>();
list1.addAll(Arrays.asList( "A", "B","C"));
ArrayList<String> list2 = new ArrayList<String>();
list2.addAll(Arrays.asList( "x", "y","z"));
ArrayList<Integer> list3 = new ArrayList<Integer>();
list3.addAll(Arrays.asList(1, 2));
// ListIterator to traverse the list
ListIterator iterator1 = list1.listIterator();
ListIterator iterator2 = list2.listIterator();
ListIterator iterator3 = list3.listIterator();
ImprovedAlternateIterator <E> l = new ImprovedAlternateIterator<E>(iterator1,iterator2,iterator3);
while (l.hasNext()) {
System.out.print(l.next()+ " ");
}
}
}
如何编写测试用例以测试自定义迭代器的hasNext()和next()的功能?
我真的很困惑,不知道要测试什么以及如何编写测试用例。我想了解有关测试的更多信息,如果您可以通过编写示例测试用例向我展示,那对我真的很有帮助。
最佳答案
我将使用“测试优先”(或“测试驱动开发”(TDD))方法。将您的代码放在一边。
编写最短的编译内容(无警告-您丢失了Iterator
上的type参数,并且next
的返回类型错误):
package alternate.iterator;
import java.util.*;
/**Alternates on the given iterators.*/
public class ImprovedAlternateIterator<E> implements Iterator<E> {
/**Initializes a new AlternatingIterator object.
* Stores the iterators in the iterators field.
* Finds the first iterator with an available element.*/
public ImprovedAlternateIterator(Iterator<E> ... iterators) {
}
@Override
public boolean hasNext() {
return true;
}
@Override
public E next() {
return null;
}
}
现在编写您最简单的测试。以最简单的方式使代码通过。必要时进行重构。再次检查测试。重复直到完成。
您可能会注意到您的界面不完整,例如,构造函数参数应为
Iterator<? extends E>
-无需先进行测试就无需修复。您缺少remove
(不幸的是,它已成为默认方法)。我通常不会首先使用这种方法,但是我认为这里非常有用。
关于java - 为自定义Iterator编写测试用例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52796390/