Разница между equals(java) и equalTo(Hamcrest)

Помогите, пожалуйста разобраться в чем разница между

  • equals(java)
  • и equalTo(Hamcrest)

как по мне делают одну и туже проверку оба делают сравнение

Например:

Assert.assertThat(actual, equalTo("test"));

делает сравнение на равенства и

String s1 = "Test";
String s2 = "Test";
System.out.println(s1.equals(s2));

->делает сравнение на равенства

Тоже самое делает сравнивает, зачем тогда нужен equalTo если есть equals?

Пожалуйста не судите строго.


Ответы (2 шт):

Автор решения: Михаил Ребров

Коротко

  • equals() сравнивает два объекта и возвращает true или false
  • equalsTo() возвращает способ сравнения двух объектов в виде лямбды описанной функциональным интерфейсом Matcher<T>

λ-выражение (лямбда-выражение) - это конструкция, которая помогает определять, передавать и многократно вызывать ряд инструкций описанных в теле выражения.

Подробно

equals() - сравнивает два объекта и дефолтная реализация(Object.equals()) сравнивает две ссылки на эти объекты.

В таком виде он имеет не очень много смысла.
Для корректной работы его необходимо переопределять.

И это здорово, когда весь код ты пишешь самостоятельно и можешь всегда написать в случае необходимости нужную реализацию.
А что если нет?

И с этим сталкиваются тестировщики, которые не имеют доступа непосредственно к рабочему коду, не могут никак на него повлиять и часто приходится иметь дело с объектами, которые предоставляются сторонними библиотеками...
И как им быть?

И для этого есть тот самый equalsTo(), о котором вы спрашивали.
Если вы посмотрите внимательно, то заметите что equalsTo() возвращает объекты типа interface Matcher<T>.

По своей сути это функциональный интерфейс, и Вы передаете в Assert.assertThat() лямбду, которая будет сравнивать два объекта.
То есть вы в Assert передаёте инструкции о том, как стоит сравнивать два объекта.
Другими словами вы указываете ЧТО и КАК ИМЕННО сравнивать.
И как водится, для самых распространенных кейсов (сравнения строк) имеются деволтные реализации и в данном случае два ваших случая идентичны.

Но давать свои плоды оно начинает, когда Вам необходимо сравнивать объекты, на классы которых вы никак повлиять не можете, а сравнивать их приходится.
Тогда и пригождается данный функциональьный интерфейс, который позволяет передать в assert СПОСОБ СРАВНЕНИЯ ДВУХ ОБЪЕКТОВ

И так как интерфейс для работы должен быть универсальным для сравнения всех объектов используется наиболее универсальный и функциональный способ с передачей Matcher'a, который может сравнивать объекты данного типа.

Таким способом, Вы сможете решать свои задачи и не зависить от вендоров.

→ Ссылка
Автор решения: Adm123

equals - это публичный метод класса Object и как следствие - всех его наследников. Т.е. метод equals есть у абсолютно любого созданного Вами объекта. Как он работает - зависит от Вас (переопределяли Вы его или нет).

equalTo - это метод, который создал для какого-то своего класса такой же программист как и Вы. Т.е. Вы можете им пользоваться, если создаете объекты класса о котором сейчас идет речь (например, это может быть какой-нибудь библиотечный класс). Объекты других классов (не потомков этого) не смогут использовать этот метод

→ Ссылка