我有两个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/