我想寫一個單元測試來比較一個方法的文本文件輸出與期望值。但是,我並不想限制測試在比較中有精確的線路排序要求。有沒有一種用Java/Junit編寫這種測試的優雅方法,還是我必須爲此任務編寫自己的邏輯?JUnit:比較兩個無序文本文件的內容
謝謝!
的setjmp
我想寫一個單元測試來比較一個方法的文本文件輸出與期望值。但是,我並不想限制測試在比較中有精確的線路排序要求。有沒有一種用Java/Junit編寫這種測試的優雅方法,還是我必須爲此任務編寫自己的邏輯?JUnit:比較兩個無序文本文件的內容
謝謝!
的setjmp
我建議你轉換測試方法和預期值的返回值轉換成字符串的兩份名單,每行一個字符串。
然後可以使用AssertJ輕鬆地比較這兩個列表。我覺得這是一個偉大的工具,當它涉及到在列表測試斷言:
@Test
public void shouldContainSameLines() throws IOException {
List<String> actualLines = ClassUnderTest.loadText();
List<String> expectedLines = asList("Hello", "World", "Goodbye");
assertThat(actualLines)
.containsAll(expectedLines);
}
assertThat()
爲切入點AssertJ的流暢API。根據傳遞給assertThat()
的方法類型,提供明智的驗證。在這種情況下,我使用containsAll()
來測試actualLines
包含任何順序在expectedLines
中的所有行。
或者,您可能會指出使用JUnit assertThat()與相應的hamcrest匹配器(我確信有類似的匹配)。 – GhostCat
您可以使用org.hamcrest.Matchers.containsInAnyOrder(T... items)
來達到此目的。
@Test
public void testSomeMethod_shouldReadFileProperly() {
String contents = "foo\nbar"; // change to actual method call
assertThat(Arrays.asList(contents.split("\n"),
containsInAnyOrder("bar", "foo"));
}
您能詳細說明一下嗎?它有點模糊。例如,該文件是否具有預定義的格式?它的內容是什麼樣子的? – luizfzs