比较JUnit中的两个对象列表

时间:2016-04-14 05:32:16

标签: java junit

我正在为我的java项目编写JUnit测试用例,并使用Coverage Tool来检查代码行。问题是:我有两个对象列表。我需要使用assertTrue或任何其他可能的断言语句将对象的结果进行比较。我通过使用下面的断言语句得到像Assertion Error这样的错误。是否有任何解决方案可以轻松比较两个列表?

//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中断言相等,而不仅仅是比较列表。

3 个答案:

答案 0 :(得分:3)

使用Assert.assertArrayEquals(Object[] expecteds, Object[] actuals)方法比较两个数组的内容相等性:

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

equals方法将数组作为相同的引用进行比较,因此它不适用于测试用例。

对于你的另一个问题:记得使用org.junit.Assert而不是junit.Assert已经过时了。

答案 1 :(得分:3)

简而言之:在编写JUnit测试时,只有一个断言需要:断言

你只需编写像

这样的代码
assertThat("optional message printed on fails", actualArrayListWhatever, is(expectedArrayListWhatever))

其中is()是一个hamcrest匹配器。

这种方法适用于各种收藏品和东西;它做了自然的“逐元素比较”的事情(并且还有很多其他的hamcrest匹配器,可用于更具体的测试;并且编写自己的匹配器也很容易。)

(严肃地说;我没有看到过一个断言()无法工作的情况;或者会导致代码不太可读;

答案 2 :(得分:1)

您可以使用

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 :(存储在列表中的用户定义对象应该覆盖equals和hashcode方法)