我正在为AddressBook做一些JUnit测试 并一直未能执行我的测试之一。这是测试:
@Test
public void parseIndices_collectionWithValidIndices_returnsIndexSet() throws Exception {
Set<Index> actualIndexSet = ParserUtil.parseIndices(Arrays.asList(VALID_INDEX_1, VALID_INDEX_2));
Index index = Index.fromOneBased(Integer.valueOf(VALID_INDEX_1));
Index index2 = Index.fromOneBased(Integer.valueOf(VALID_INDEX_2));
Set<Index> expectedIndexSet = new HashSet<>();
expectedIndexSet.add(index);
expectedIndexSet.add(index2);
assertEquals(expectedIndexSet, actualIndexSet);
}
输出显示如下:
它表明它们是相等的,但是断言在某种程度上一直失败。然后,我尝试声明2个actualIndexSets(如下所示),以查看它们是否可以通过测试,但仍然失败,并且结果很奇怪。
@Test
public void parseIndices_collectionWithValidIndices_returnsIndexSet() throws Exception {
Set<Index> actualIndexSet = ParserUtil.parseIndices(Arrays.asList(VALID_INDEX_1, VALID_INDEX_2));
Set<Index> actualIndexSet2 = ParserUtil.parseIndices(Arrays.asList(VALID_INDEX_1, VALID_INDEX_2));
Index index = Index.fromOneBased(Integer.valueOf(VALID_INDEX_1));
Index index2 = Index.fromOneBased(Integer.valueOf(VALID_INDEX_2));
Set<Index> expectedIndexSet = new HashSet<>();
expectedIndexSet.add(index);
expectedIndexSet.add(index2);
assertEquals(actualIndexSet2, actualIndexSet);
}
这里的问题是,某些事情显然是不正确的,因为当我断言2套actualIndexSet时,它们会失败,这与给定Index类的断言工作正常是相同的。
答案 0 :(得分:0)
HashSet覆盖等于;它会检查第一组是否包含第二组的全部。
唯一可能的原因是您的Index类没有覆盖等于。 当方法containsAll被调用时,它将遍历所有索引元素,并检查equals的结果是否为真。
答案 1 :(得分:0)
您的问题似乎是equals
方法及其在Index
类中的定义。
我建议使用apache commons之类的库为您解决该问题:
CollectionUtils.isEqualCollection(expectedIndexSet, actualIndexSet)
答案 2 :(得分:0)
@Override
public int hashCode() {
return zeroBasedIndex;
}
重写Index类中的hashCode方法。