JUnit assertEquals因HashSet失败

时间:2018-10-15 10:37:13

标签: java junit addressbook

我正在为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);
}

输出显示如下:

Output of running test 它表明它们是相等的,但是断言在某种程度上一直失败。然后,我尝试声明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类的断言工作正常是相同的。

3 个答案:

答案 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方法。