java - 为自定义迭代器编写测试用例

标签 java unit-testing junit iterator

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

[a,b,c], [1,2] and [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 上的类型参数,并且 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;
    }
}

现在编写最简单的测试。让代码以尽可能简单的方式通过。必要时重构。再次检查测试。重复直到完成。

您可能会注意到您的接口(interface)不完整,例如构造函数参数应该是 Iterator<? extends E> - 无需先进行测试即可修复。您失踪了remove (不幸的是,它已成为默认方法)。

这不是通常首先使用的方法,但我认为它在这里非常有用。

关于java - 为自定义迭代器编写测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52796390/

相关文章:

java - 断言失败时触发函数

java - 如何在 host monster 提供的服务器上运行 java web 应用程序

java - ProGuard 使应用程序无法使用 "could not convert to dex bytecode with error 1"进行编译

java - 使用增强的 for 循环搜索特定字符,但仅打印 ArrayList 中的第一个匹配字符

java - 从 java 提交 HTML 表单需要 cookies 和弹出窗口拦截器

c# - 迭代器 block 的奇怪测试覆盖率结果,为什么不执行这些语句?

java - 如何为自定义 OutputStream 编写单元测试

java - 获取特定 JTable 单元格中的前景(字体)

junit - 如何在play框架2.3.2中运行JUnit测试用例

java - 断言与 JUnit 断言