我正在为我的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中断言相等,而不仅仅是比较列表。
答案 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方法)