我有两个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中看不到适当的检查方法。

最佳答案

文档说:

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

关于java - 如何在单元测试中比较迭代器的内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42657975/

10-10 11:07