2015-11-12 18 views
3

我目前正在編寫一個單元測試,檢查一個方法是否正確排序列表。列表排序實現的單元測試?

排序方法正在覆蓋類別Comparator中的compare方法,並且正在使用Collections.sort()對列表進行排序。

它可能不是一個技術問題,但我正在尋找一種方式來使用JUnit的斷言來檢查列表正確排序...

名單由類型的內部參數排序它正在舉行,讓我叫它id。因此,當列表包含3個ID爲3,1,2的項目時,它們應按1,2,3分類。

Long expected1 = listOfObjects.get(0).getId() 
Long expected2 = listOfObjects.get(1).getId() 
Long expected3 = listOfObjects.get(2).getId() 

然後在這些長對象上使用asserions看起來並不乾淨,也不聰明。我正在尋找一個想法如何幹淨,聰明地測試這種情況下,但我的想法...

+0

你有限制自己的JUnit?你可以在這裏使用assertj效果很好 – fge

+1

可能的重複[如何檢查集合是否包含使用Hamcrest的給定順序的項目](http://stackoverflow.com/questions/15609132/how-to-check-if-collection-contains使用hamcrest的問題) –

+2

不完全是問題,但是因爲使用了Collections.sort(),所以簡單地測試比較器類是不是更容易?它有你想要排序的邏輯,它可能更容易測試(總是相同的輸入等),例如Assert.assertEquals(1,comparator.compare(1,2))等 – pandaadb

回答

1

看看我的演示文稿,其中包含關於asserting on listsshazamcrest庫解決問題的一點。

有了它,你可以做assertThat(actual, sameBeanAs(asList(a, b, c))),其中a,bc是你的任何類型的對象。

+0

爲什麼使用shazzamcrest,Hamcrests'contains'已經做到了這一點? –

+0

如果你想斷言對象,他們將需要有'equals'方法(或者你必須持有對列表中每個對象的引用)。對於'shazamcrest',這並不重要。同樣,'sameBeanAs'會拋出'ComparisonFailure',這樣你就可以得到非常好的診斷結果。 –

4

IMO,你應該只是單元測試你寫的compare方法。 Collections.sort()已經過嚴格測試!

只要有一個簡單的最終測試,以確保Collections.sort()正確的你寫的方法稱爲:

private final MyComparator comparator = new MyComparator(); 

@Test 
public greaterTest() { 
    MyObject o1 = new MyObject(2); 
    MyObject o2 = new MyObject(1); 
    int c = comparator.compare(o1, o2); 
    // assert that c is > 0 
} 

@Test 
public lowerTest() { 
    MyObject o1 = new MyObject(1); 
    MyObject o2 = new MyObject(2); 
    int c = comparator.compare(o1, o2); 
    // assert that c is < 0 
} 

@Test 
public equalTest() { 
    MyObject o1 = new MyObject(2); 
    MyObject o2 = new MyObject(2); 
    int c = comparator.compare(o1, o2); 
    // assert that c is == 0 
} 

@Test 
public sortTest() { 
    List<MyObject> os = // ... 
    // call to the function that makes the call to Collections.sort 
    List<MyObject> expected = // sorted version of os 
    // assert that the sorted list is equal to the expected one 
}