JUnit 4比较集合

你如何简洁地断言collections元素的平等,特别是JUnit 4Set

你可以断言两个集合是相等的,调用Set equals()方法 。

 public class SimpleTest { private Set<String> setA; private Set<String> setB; @Before public void setUp() { setA = new HashSet<String>(); setA.add("Testing..."); setB = new HashSet<String>(); setB.add("Testing..."); } @Test public void testEqualSets() { assertEquals( setA, setB ); } } 

如果两个集合具有相同的大小并且包含相同的元素,则该testing将通过。

阿帕奇的共同点再次拯救。

 assertTrue(CollectionUtils.isEqualCollection(coll1, coll2)); 

奇迹般有效。 我不知道为什么,但我发现收集以下assertEquals(coll1, coll2)并不总是工作。 在失败的情况下,我有两个集合支持的集合。 尽pipe我知道确实是这样,但是Hamcrest和Junit都不会说收集是平等的。 使用CollectionUtils它完美的作品。

与hamcrest :

 assertThat(s1, is(s2)); 

简单地断言:

 assertEquals(s1, s2); 

注意:使用具体集合类的equals()方法

一个特别有趣的情况是当你比较

  java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]> 

  java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]> 

到目前为止,我所看到的唯一解决scheme是将它们两个都改成集合

 assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes())); 

或者我可以逐个比较它们。

作为一个基于数组的附加方法…你可以考虑在junitx中使用无序数组断言。 虽然Apache CollectionUtils的例子可以工作,但是也有一些固定的断言扩展:

我认为

 ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2}); 

方法将会更具可读性和可debugging性(所有Collections都支持toArray(),因此使用ArrayAssert方法应该很容易。

当然这里的缺点是,junitx是一个额外的jar文件或maven条目…

  <dependency org="junit-addons" name="junit-addons" rev="1.4"/> 

检查这篇文章 。 从那里的一个例子:

 @Test public void listEquality() { List<Integer> expected = new ArrayList<Integer>(); expected.add(5); List<Integer> actual = new ArrayList<Integer>(); actual.add(5); assertEquals(expected, actual); } 

使用Hamcrest:

 assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1))); 

这也适用于集合具有不同的数据types时,报告差异而不是仅仅失败。

如果你想检查一个List或Set是否包含一组特定的值(而不是将它与一个已经存在的集合进行比较),通常toString方法的集合是很方便的:

 String[] actualResult = calltestedmethod(); assertEquals("[foo, bar]", Arrays.asList(actualResult).toString()); List otherResult = callothertestedmethod(); assertEquals("[42, mice]", otherResult.toString()); 

这比首先构build期望的集合并将其与实际集合进行比较稍微短一些,并且更容易编写和更正。

(不可否认,这不是一个特别干净的方法,不能从“foo”和“bar”两个元素中区分“foo,bar”元素,但实际上我觉得编写testing是很简单和快速的,否则很多开发者不会不被压制。)