Я создал класс и переопределил метод 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.