JUnit assertEquals не работает с HashSet - PullRequest
0 голосов
/ 15 октября 2018

Я проводил некоторые тесты JUnit для AddressBook и продолжал не выполнять один из моих тестов.Вот этот тест:

@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 набора фактическогоIndexSet, которые являются одинаковыми, учитывая, что утверждение для класса Index работает нормально.

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Ваша проблема, похоже, в методе equals и его определении в классе Index.

Я бы порекомендовал использовать такую ​​библиотеку, как Apache Commons, чтобы решить эту проблему за вас:

CollectionUtils.isEqualCollection(expectedIndexSet, actualIndexSet)
0 голосов
/ 15 октября 2018
@Override
public int hashCode() {
    return zeroBasedIndex;
}

Переопределение метода hashCode в классе Index занято этим.

0 голосов
/ 15 октября 2018

HashSet переопределяет равно;он проверяет, содержит ли первый набор все из второго набора.

Единственная возможная причина в том, что ваш класс Index не переопределяет equals.когда будет вызван метод containsAll, он будет перебирать все элементы индекса и проверять, равен ли true результат equals.

...