Страницы

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

суббота, 11 января 2020 г.

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

#java #junit


У меня тест в конце которого проверка двух объектов на равенство:

assertThat(result, is(proposal1));


И мне падает ошибка хотя Expected и Actual в логе показаны одинаковыми:

java.lang.AssertionError: 
Expected: is 
     but: was 
Expected :is 

Actual   :


Разве два объекта с одинаковым состояние не должны проходить assertThat???

Как мне это поправить?
    


Ответы

Ответ 1



Для того, чтобы объекты корректно сравнивались на равенство нужно переопределить метод 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.

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

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