ソースがない、equals()メソッドのないクラスがあるとします。そのクラスの2つのインスタンスで同等であることを主張したいと思います。
複数のアサートを実行できます:
assertEquals(obj1.getFieldA(), obj2.getFieldA());
assertEquals(obj1.getFieldB(), obj2.getFieldB());
assertEquals(obj1.getFieldC(), obj2.getFieldC());
...
初期のアサートが失敗した場合、完全な等価性の画像が得られないため、このソリューションは好きではありません。
自分で手動で比較して結果を追跡できます。
String errorStr = "";
if(!obj1.getFieldA().equals(obj2.getFieldA())) {
errorStr += "expected: " + obj1.getFieldA() + ", actual: " + obj2.getFieldA() + "\n";
}
if(!obj1.getFieldB().equals(obj2.getFieldB())) {
errorStr += "expected: " + obj1.getFieldB() + ", actual: " + obj2.getFieldB() + "\n";
}
...
assertEquals("", errorStr);
これは私に完全な平等の状況を与えますが、不格好です(そして、私は起こり得るnullの問題を説明していません)。3番目のオプションはコンパレータを使用することですが、compareTo()はどのフィールドが等価に失敗したかを教えてくれません。
等しい(サブ)をサブクラス化してオーバーライドせずに、オブジェクトから必要なものを取得するためのより良いプラクティスはありますか?
equal
メソッドの実装は2つのインスタンスが等しいかどうかを通知するだけであり、インスタンスが等しくない理由は気にしません。
Object
のにはequals
メソッドがあり、オーバーライドされたequalsメソッドがないことをおそらく意味します。