Подтвердить что ты не робот

JUnit assertEquals() не выполняется для двух объектов

Я создал класс и переопределил метод equals(). Когда я использую assertTrue(obj1.equals(obj2)), он пройдет тест; однако assertEquals(obj1, obj2) завершит тест. Может кто-нибудь рассказать причину, почему?

4b9b3361

Ответ 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.