我创建了一个自定义迭代器,该迭代器在其构造函数中接受多个迭代器,并为使用三个迭代器构造的示例生成备用输出:


  [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/

10-11 22:28
查看更多