Разница между 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илиfalseequalsTo()возвращает способ сравнения двух объектов в виде лямбды описанной функциональным интерфейсомMatcher<T>
λ-выражение (лямбда-выражение) - это конструкция, которая помогает определять, передавать и многократно вызывать ряд инструкций описанных в теле выражения.
Подробно
equals() - сравнивает два объекта и дефолтная реализация(Object.equals()) сравнивает две ссылки на эти объекты.
В таком виде он имеет не очень много смысла.
Для корректной работы его необходимо переопределять.
И это здорово, когда весь код ты пишешь самостоятельно и можешь всегда написать в случае необходимости нужную реализацию.
А что если нет?
И с этим сталкиваются тестировщики, которые не имеют доступа непосредственно к рабочему коду, не могут никак на него повлиять и часто приходится иметь дело с объектами, которые предоставляются сторонними библиотеками...
И как им быть?
И для этого есть тот самый equalsTo(), о котором вы спрашивали.
Если вы посмотрите внимательно, то заметите что equalsTo() возвращает объекты типа interface Matcher<T>.
По своей сути это функциональный интерфейс, и Вы передаете в Assert.assertThat() лямбду, которая будет сравнивать два объекта.
То есть вы в Assert передаёте инструкции о том, как стоит сравнивать два объекта.
Другими словами вы указываете ЧТО и КАК ИМЕННО сравнивать.
И как водится, для самых распространенных кейсов (сравнения строк) имеются деволтные реализации и в данном случае два ваших случая идентичны.
Но давать свои плоды оно начинает, когда Вам необходимо сравнивать объекты, на классы которых вы никак повлиять не можете, а сравнивать их приходится.
Тогда и пригождается данный функциональьный интерфейс, который позволяет передать в assert СПОСОБ СРАВНЕНИЯ ДВУХ ОБЪЕКТОВ
И так как интерфейс для работы должен быть универсальным для сравнения всех объектов используется наиболее универсальный и функциональный способ с передачей Matcher'a, который может сравнивать объекты данного типа.
Таким способом, Вы сможете решать свои задачи и не зависить от вендоров.
equals - это публичный метод класса Object и как следствие - всех его наследников. Т.е. метод equals есть у абсолютно любого созданного Вами объекта. Как он работает - зависит от Вас (переопределяли Вы его или нет).
equalTo - это метод, который создал для какого-то своего класса такой же программист как и Вы. Т.е. Вы можете им пользоваться, если создаете объекты класса о котором сейчас идет речь (например, это может быть какой-нибудь библиотечный класс). Объекты других классов (не потомков этого) не смогут использовать этот метод