JUnit 4比较集合
你如何简洁地断言collections
元素的平等,特别是JUnit 4
的Set
?
你可以断言两个集合是相等的,调用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是很简单和快速的,否则很多开发者不会不被压制。)