Answers:
您可以断言两个Set
s彼此相等,这将调用Set
equals()
method。
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 );
}
}
此@Test
如果两个将传递Set
s为相同的大小和包含相同的元素。
equals
和hashCode
中,你是在为你散列表存储类中实现?
Apache Commons再次获救。
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
奇迹般有效。我不知道为什么,但是我发现以下内容assertEquals(coll1, coll2)
并不总是有效。在我失败的情况下,我有两个由Sets支持的收藏。hamcrest和junit都不会说这些收藏是平等的,即使我确信它们是相等的。使用CollectionUtils可以完美地工作。
比较有趣的情况是
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
和
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
到目前为止,我看到的唯一解决方案是将它们都更改为集合
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});
这种方法对您来说更具可读性和可调试性(所有Collections都支持toArray(),因此使用ArrayAssert方法应该足够容易。
当然,这里的缺点是,junitx是附加的jar文件或maven条目...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
如果要检查列表或集合是否包含一组特定值(而不是将其与现有集合进行比较),则通常使用集合的toString方法很方便:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
这比首先构造期望的集合并将其与实际集合进行比较要短一些,并且更容易编写和更正。
(不可否认,这不是一种特别干净的方法,不能将元素“ foo,bar”与两个元素“ foo”和“ bar”区分开。但是实际上,我认为最重要的是,编写测试要容易且快速,否则,许多开发人员都不会被迫。)
我喜欢Hans-PeterStörr的解决方案...但是我认为这不太正确。可悲的containsInAnyOrder
是不接受Collection
objetcs进行比较。因此,它必须是一个Collection
的Matcher
S:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
导入是:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;