2017-03-07 109 views
0

我有两个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()); 
} 

此代码insn't完美的,但无论是在一个断言做这个能力AssertJ?

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

回答

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

+0

Ha-ha ...我看到了这个方法,但它不能作为'expected'扫描器实现'Iterator ',但'containsExactlyElementsOf'方法需要'Iterable <?作为参数扩展ELEMENT>'。 –

+0

啊,好点。查看我的更新。 – Jeremy

+0

@Jeramy它与我预期的略有不同,但是......谢谢! –