クラスを作成し、equals()メソッドをオーバーライドしました。 assertTrue(obj1.equals(obj2))
を使用すると、テストに合格します。ただし、assertEquals(obj1, obj2)
はテストに失敗します。理由を誰かに教えてもらえますか?
私の推測では、実際にはオーバーライドされていません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)
のみを呼び出します。
これは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
値との比較を正しく処理していない場合、これがあなたが説明したように動作する唯一のケースを考えることができます。