Я создал класс и переопределил метод equals(). Когда я использую assertTrue(obj1.equals(obj2))
, он пройдет тест; однако assertEquals(obj1, obj2)
завершит тест. Может кто-нибудь рассказать причину, почему?
JUnit assertEquals() не выполняется для двух объектов
Ответ 1
Я предполагаю, что вы на самом деле не переопределили equals
, что вы перегрузили его. Используйте аннотацию @Override
, чтобы найти такую вещь во время компиляции.
Другими словами, я подозреваю, что у вас есть:
public boolean equals(MyClass other)
где вы должны:
@Override // Force the compiler to check I'm really overriding something
public boolean equals(Object other)
В вашем рабочем утверждении вы, без сомнения, вызывали перегруженный метод, поскольку тип obj1
и obj2
времени компиляции был MyClass
(или независимо от того, что вызвал ваш класс). JUnit assertEquals
будет вызывать только equals(Object)
, поскольку он не знает ничего лучшего.
Ответ 2
Вот код для assertEquals
(из Github):
static public void assertEquals(String message, Object expected,
Object actual) {
if (expected == null && actual == null)
return;
if (expected != null && isEquals(expected, actual))
return;
else if (expected instanceof String && actual instanceof String) {
String cleanMessage= message == null ? "" : message;
throw new ComparisonFailure(cleanMessage, (String) expected,
(String) actual);
} else
failNotEquals(message, expected, actual);
}
private static boolean isEquals(Object expected, Object actual) {
return expected.equals(actual);
}
Я могу думать только о одном случае, когда это ведет себя так, как вы описали, - если ваш метод equals
не корректно обрабатывает значения null
.