如何比较单元测试中的迭代器内容?
How to compare iterators content in unit test?
我有两个 java.util.Scanner
对象。 Scanner
class 实施 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 是否能够在一个断言中执行此操作?
我在 Assertions
class 中看到静态 IterableAssert<ELEMENT> assertThat(Iterator<? extends ELEMENT> actual)
方法,但在 IterableAssert
.
中看不到适当的检查方法
文档说:
softly.assertThat(actual).containsExactlyElementsOf(expected);
因此,您可以创建一个自定义 Iterable
returns 您的扫描仪
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.util.Scanner
对象。 Scanner
class 实施 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 是否能够在一个断言中执行此操作?
我在 Assertions
class 中看到静态 IterableAssert<ELEMENT> assertThat(Iterator<? extends ELEMENT> actual)
方法,但在 IterableAssert
.
文档说:
softly.assertThat(actual).containsExactlyElementsOf(expected);
因此,您可以创建一个自定义 Iterable
returns 您的扫描仪
public class ScannerIterable implements Iterable<String> {
private Scanner scanner;
public ScanerIterable(Scanner scanner) {
this.scanner = scanner;
}
@Override
public Iterator<String> iterator() {
return scanner;
}
}
这可以做成通用的,所以它可以接受任何类型的 Iterator
。