สมมติว่าฉันมีคลาสที่ไม่มีเมธอดเท่ากับ () ซึ่งไม่มีแหล่งที่มา ฉันต้องการยืนยันความเท่าเทียมกันในสองอินสแตนซ์ของคลาสนั้น
ฉันสามารถยืนยันได้หลายข้อ:
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);
สิ่งนี้ทำให้ฉันเห็นภาพความเท่าเทียมกันเต็มรูปแบบ แต่เป็นเรื่องที่ยุ่งเหยิง (และฉันไม่ได้คิดถึงปัญหาว่างที่เป็นไปได้) ตัวเลือกที่สามคือการใช้ตัวเปรียบเทียบ แต่ CompareTo () จะไม่บอกฉันว่าฟิลด์ใดล้มเหลวในความเท่าเทียมกัน
มีแนวทางปฏิบัติที่ดีกว่าไหมที่จะได้รับสิ่งที่ฉันต้องการจากวัตถุโดยไม่ต้องคลาสย่อยและการเขียนทับเท่ากับ (ฮึ)
equal
เมธอดจะบอกได้ว่าสองอินสแตนซ์เท่ากันหรือไม่และเราไม่สนใจว่าทำไมอินสแตนซ์ไม่เท่ากัน
Object
มีequals
วิธีการคุณอาจหมายถึงไม่มีวิธีการเท่ากับที่ถูกแทนที่