Class IteratorTester<E>

java.lang.Object
com.google.common.collect.testing.AbstractIteratorTester<E,Iterator<E>>
com.google.common.collect.testing.IteratorTester<E>

public abstract class IteratorTester<E> extends AbstractIteratorTester<E,Iterator<E>>
A utility for testing an Iterator implementation by comparing its behavior to that of a "known good" reference implementation. In order to accomplish this, it's important to test a great variety of sequences of the Iterator.next(), Iterator.hasNext() and Iterator.remove() operations. This utility takes the brute-force approach of trying all possible sequences of these operations, up to a given number of steps. So, if the caller specifies to use n steps, a total of 3^n tests are actually performed.

For instance, if steps is 5, one example sequence that will be tested is:

  1. remove();
  2. hasNext()
  3. hasNext();
  4. remove();
  5. next();

This particular order of operations may be unrealistic, and testing all 3^5 of them may be thought of as overkill; however, it's difficult to determine which proper subset of this massive set would be sufficient to expose any possible bug. Brute force is simpler.

To use this class the concrete subclass must implement the AbstractIteratorTester.newTargetIterator() method. This is because it's impossible to test an Iterator without changing its state, so the tester needs a steady supply of fresh Iterators.

If your iterator supports modification through remove(), you may wish to override the verify() method, which is called after each sequence and is guaranteed to be called using the latest values obtained from AbstractIteratorTester.newTargetIterator().

The value you pass to the parameter steps should be greater than the length of your iterator, so that this class can check that your iterator behaves correctly when it is exhausted.

For example, to test Collections.unmodifiableList's iterator:


 List<String> expectedElements =
     Arrays.asList("a", "b", "c", "d", "e");
 List<String> actualElements =
     Collections.unmodifiableList(
         Arrays.asList("a", "b", "c", "d", "e"));
 IteratorTester<String> iteratorTester =
     new IteratorTester<String>(
         6,
         IteratorFeature.UNMODIFIABLE,
         expectedElements,
         IteratorTester.KnownOrder.KNOWN_ORDER) {
       @Override
       protected Iterator<String> newTargetIterator() {
         return actualElements.iterator();
       }
     };
 iteratorTester.test();
 iteratorTester.testForEachRemaining();
 

Note: It is necessary to use IteratorTester.KnownOrder as shown above, rather than KnownOrder directly, because otherwise the code cannot be compiled.