2016-04-14 28 views
2

我正在爲我的java項目編寫JUnit測試用例,並使用Coverage Tool檢查代碼行是否覆蓋。問題是:我有兩個對象列表。我需要使用assertTrue或任何其他可能的斷言語句來比較對象的結果。通過使用下面的assert語句,我得到了像斷言錯誤一樣的錯誤。有什麼解決方案可以輕鬆比較兩個列表嗎?比較JUnit中的兩個對象列表

//actual  
List<ProjectData> actuals = ProjectManagerDao.getProjects("x", "y", "z"); 
// expected 
List<ProjectData> expecteds = new ArrayList<>(); 
ProjectData p1 = new ProjectData(); 
p1.setId("a"); 
p1.setName("b"); 
expecteds.add(p1); 

assertTrue(JsonProvider.getGson().toJson(actuals).equalsIgnoreCase(JsonProvider.getGson().toJson(expecteds))); 
//or 
assertTrue(actuals.equalIgnoreCase(expeteds);//Not working for list of objects but working for comparing two strings 

這不同於Java Compare Two Lists中,我需要能夠斷言平等JUnit中,不只是對比列表。

+0

感謝您的評論,但我需要使用JUnit的斷言語句不比較2所列出Java .. –

+1

只需將比較結果分配給'boolean',然後對其進行斷言。 –

+0

讓我試試,但你可以顯示如何? –

回答

3

使用Assert.assertArrayEquals(Object[] expecteds, Object[] actuals)方法來比較兩個陣列的內容相等:

Assert.assertArrayEquals(expected.toArray(), actuals.toArray()); 

equals方法是相同的參考,所以它不是合適的在測試例比較陣列。

對於你的其他問題:請記住使用org.junit.Assert而不是junit.Assert哪個變得過時了。

0

您可以使用

Assert.assertEquals(java.lang.Object expected, java.lang.Object actual); 

例如:

ArrayList<String> list1 = new ArrayList<>(); 
list1.add("hello"); 
ArrayList<String> list2 = new ArrayList<>(); 
list2.add("hello"); 
Assert.assertEquals(list1, list2); 

來源:Junit API

,或者如果你想使用數組比較的方法,你可以按照以下

ArrayList<String> list1; 
ArrayList<String> list2; 

Assert.assertArrayEquals(list1.toArray(), list2.toArray()); 

我會建議你使用assertEquals方法。

PS:

+0

但斷言。assertEquals顯示我棄用的函數和第二個將工作,但沒有斷言聲明像assertArrayEquals –

+0

確定哪個版本的JUnit庫是玩具使用? – praveen

+0

JUnit 4,也使用EclEmma插件的覆蓋工具 –

3

總之(存儲列表中應該有覆蓋了equals和hashCode方法內的用戶定義的對象):恰好有一個斷言,一個人需要寫的時候JUnit測試:assertThat

你只寫代碼一樣

assertThat("optional message printed on fails", actualArrayListWhatever, is(expectedArrayListWhatever)) 

其中is()是hamcrest匹配。

這種方法適用於各種收藏和物品;它可以自然地「比較每個元素」(還有很多其他的hamcrest匹配器,可以用於更具體的測試;並且編寫自己的匹配器也很容易)。

(嚴重,我還沒有看到一個單一的情況下assertThat()是行不通的;或將導致更少的可讀的代碼)