2017-07-26 181 views
0

我想寫一個單元測試來比較一個方法的文本文件輸出與期望值。但是,我並不想限制測試在比較中有精確的線路排序要求。有沒有一種用Java/Junit編寫這種測試的優雅方法,還是我必須爲此任務編寫自己的邏輯?JUnit:比較兩個無序文本文件的內容

謝謝!

的setjmp

+0

您能詳細說明一下嗎?它有點模糊。例如,該文件是否具有預定義的格式?它的內容是什麼樣子的? – luizfzs

回答

2

我建議你轉換測試方法和預期值的返回值轉換成字符串的兩份名單,每行一個字符串。

然後可以使用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中的所有行。

+0

或者,您可能會指出使用JUnit assertThat()與相應的hamcrest匹配器(我確信有類似的匹配)。 – GhostCat

0

您可以使用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")); 
}