Проверить два экземпляра объекта равны JUnit
У меня есть два объекта A
и B
. Объект A
- это фактический результат, который я получаю во время теста JUnit. Объект B
заключается в том, что я выполняю фактический вызов end db и принимаю как ожидаемый обзор. Мне нужно утверждать, что два экземпляра объекта A
и B
равны по значению, а не фактическому объекту.
В JUnit есть метод, называемый assertEquals(obj expected, obj actual)
, но я не хочу этого.
Есть ли способ или обходной путь для достижения того же?
Ответы
Ответ 1
Подумайте о том, чего именно вы пытаетесь достичь. Вы хотите проверить идентификацию объекта или убедиться, что два объекта имеют точно такие же данные? Из вашего предложения assertEquals, я предполагаю, что вы хотите идти по полю.
Если объекты мелкие, вы можете использовать
assertThat(actual, samePropertyValuesAs(expected));
Это не удается, если объект является составным. Если вы хотите пройти весь график, вы можете использовать sameBeanAs, который мы писали некоторое время назад, чтобы решить эту проблему:
assertThat(actual, sameBeanAs(expected));
Если вы используете AssertJ, вы также можете использовать встроенные функции следующим образом:
assertThat(actual).isEqualToComparingFieldByField(expected);
Одна вещь, которую вы не хотите делать, переопределяет метод equals
для этого, поскольку это может измениться в будущем для удовлетворения потребностей бизнеса.
Ответ 2
Если вы хотите глубокого равенства, вы можете использовать Commons Lang3 EqualsBuilder#reflectionEquals()
:
Assert.assertTrue(EqualsBuilder.reflectionEquals(expected,actual));
Ответ 3
вы можете утверждать каждого члена этих двух объектов!
например. assertThat(actual).isEqualToComparingFieldByField(expected);
Ответ 4
assertEquals()
вызывает equals()
на ваших объектах, и об этом нет. Вы можете сделать что-то вроде public boolean like(MyClass b)
в своем классе, в котором вы бы сравнили все, что захотите. Затем вы можете проверить результат, используя assertTrue(a.like(b))
.
Ответ 5
Вам необходимо переопределить метод equals
и для эффективной практики hashCode
для вашего класса. После этого assertEquals(obj expected, obj actual)
не будет проверять ссылку, но будет использовать логику, реализованную в методе equals
.