2017-03-07 106 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它與我預期的略有不同,但是......謝謝! –