Страницы

Поиск по вопросам

вторник, 5 марта 2019 г.

Как Assert.assertThat() в Junit делает сравнение результатов теста?

У меня тест в конце которого проверка двух объектов на равенство:
assertThat(result, is(proposal1));
И мне падает ошибка хотя Expected и Actual в логе показаны одинаковыми:
java.lang.AssertionError: Expected: is but: was Expected :is
Actual :
Разве два объекта с одинаковым состояние не должны проходить assertThat???
Как мне это поправить?


Ответ

Для того, чтобы объекты корректно сравнивались на равенство нужно переопределить метод Object.equals и реализовать логику сравнения по нужным полям.
Если equals не переопределен, то будет использоваться реализация по умолчанию в который равными считаются только ссылки на один и тот же объект. Совпадение значений полей роли не играет.
Из документации:
The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
Если equals переопределен, то нужно искать ошибку в реализации метода.
UPDATE (по JUnit): Junit также не выполняет сверку полей в данном случае:
assertThat обращается к переданному matcher-у, в данном случае is
Asserts that actual satisfies the condition specified by matcher.
is обращается к equalTo
A shortcut to the frequently used is(equalTo(x)).
equalTo использует equals с предпроверкой на null
Creates a matcher that matches when the examined object is logically equal to the specified operand, as determined by calling the Object.equals(java.lang.Object) method on the examined object.

Комментариев нет:

Отправить комментарий