如何比较单元测试中的迭代器内容?

时间:2017-03-07 20:44:04

标签: java junit assertj

我有两个java.util.Scanner个对象。 Scanner类实现Iterator<String>。我想比较扫描仪,并且能够轻松查看不同的线条。

目前我以这种方式使用AssertJ软断言

@Rule
JUnitSoftAssertions softly = new JUnitSoftAssertions();
...
Scanner actual = ...
Scanner expected = ...

int i = 0;
while (actual.hasNext() && expected.hasNext()) {
  softly.assertThat(actual.next()).as("line %s", i++).isEqualTo(expected.next());
}

这段代码并不完美,但AssertJ中是否有能力在一个断言中执行此操作?

我在IterableAssert<ELEMENT> assertThat(Iterator<? extends ELEMENT> actual)类中看到了静态Assertions方法,但在IterableAssert中找不到合适的检查方法。

1 个答案:

答案 0 :(得分:1)

文档说:

softly.assertThat(actual).containsExactlyElementsOf(expected);

请参阅:http://joel-costigliola.github.io/assertj/core/api/org/assertj/core/api/AbstractIterableAssert.html#containsExactlyElementsOf(java.lang.Iterable)

因此,您可以创建一个返回扫描仪的自定义Iterable

public class ScannerIterable implements Iterable<String> {

    private Scanner scanner;

    public ScanerIterable(Scanner scanner) {
        this.scanner = scanner;
    }

    @Override
    public Iterator<String> iterator() {
        return scanner;
    }
}

这可以是通用的,因此可以采用任何类型的Iterator