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

标签 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 中看不到适当的检查方法.

最佳答案

文档说:

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;
    }
}

这可以是通用的,因此它可以采用任何类型的迭代器

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

相关文章:

java - 没有从 join() 方法中得到 InterruptedException

java - 如何在 Java Mission Control 中启用对象类型 + 分配堆栈跟踪 + GC 根路径

java - 如何在由 spring 关闭的可自动关闭 bean 的单元测试中覆盖 close 方法

java - Eclipse 中的 jUnit 抛出空指针异常

java - AssertJ:一种检查对象字段值是否包含特定模式(正则表达式)的方法

java - 测试忽略某些字段的列表内容

java - 将 jar 输出通过管道传输到 python 中的文件

java - NetBean GUI 构建器中的 JSplitPane

java - 有没有办法在通过 Surefire 插件执行时排除功能文件包?

java - AssertJ:如何在没有条件的情况下对任何可能的值进行比较