web-dev-qa-db-ja.com

2つのオブジェクトでJUnit assertEquals()が失敗する

クラスを作成し、equals()メソッドをオーバーライドしました。 assertTrue(obj1.equals(obj2))を使用すると、テストに合格します。ただし、assertEquals(obj1, obj2)はテストに失敗します。理由を誰かに教えてもらえますか?

22
Terry Li

私の推測では、実際にはオーバーライドされていません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)のみを呼び出します。

31
Jon Skeet

これはassertEqualsのコードです(from 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値との比較を正しく処理していない場合、これがあなたが説明したように動作する唯一のケースを考えることができます。

1
Binil Thomas