assertEquals(Object, Object)
จาก JUnit4 / JUnit 5 หรือ assertThat(actual, is(expected));
จาก Hamcrest ที่เสนอในคำตอบอื่น ๆ จะใช้งานได้ทั้งในฐานะที่เป็นequals()
และtoString()
ถูกแทนที่สำหรับชั้นเรียน (และลึก) ของวัตถุที่เปรียบเทียบ
มันมีความสำคัญเนื่องจากการทดสอบความเท่าเทียมกันในการยืนยันนั้นอาศัยequals()
และข้อความทดสอบความล้มเหลวนั้นขึ้นอยู่toString()
กับวัตถุที่เปรียบเทียบ
สำหรับในตัวชั้นเรียนเช่นString
, Integer
และอื่น ๆ สำหรับปัญหา ... เป็นแทนที่เหล่านี้ไม่มีทั้งสองและequals()
toString()
ดังนั้นจึงเป็นสิ่งที่ถูกต้องสมบูรณ์ที่จะยืนยันList<String>
หรือกับList<Integer>
และเกี่ยวกับเรื่องนี้: คุณต้องแทนที่ในชั้นเรียนเพราะมันสมเหตุสมผลในแง่ของความเสมอภาคของวัตถุไม่ใช่เพียงเพื่อให้การยืนยันง่ายขึ้นในการทดสอบกับ JUnit
เพื่อให้การยืนยันง่ายขึ้นคุณมีวิธีอื่น
ตามแนวทางปฏิบัติที่ดีฉันชอบห้องสมุดการยืนยัน / การจับคู่ assertEquals(Object,Object)
equals()
นี่คือวิธีแก้ปัญหา AssertJ
org.assertj.core.api.ListAssert.containsExactly()
คือสิ่งที่คุณต้องการ: มันจะตรวจสอบว่ากลุ่มจริงมีค่าที่กำหนดอย่างแน่นอนและไม่มีอะไรอื่นตามที่ระบุไว้ใน javadoc
สมมติFoo
คลาสที่คุณเพิ่มอิลิเมนต์และที่ที่คุณสามารถรับได้
การทดสอบหน่วยของFoo
ยืนยันว่าทั้งสองรายการมีเนื้อหาเหมือนกันอาจมีลักษณะดังนี้:
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add("One", "Two", "Three");
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
}
จุดที่ดีของ AssertJ ก็คือการประกาศ a List
อย่างที่คาดไว้นั้นไม่จำเป็น: มันทำให้การยืนยันตรงและโค้ดอ่านง่ายขึ้น:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
แต่ห้องสมุด Assertion / matcher นั้นเป็นสิ่งที่ต้องทำเพราะสิ่งเหล่านี้จะเพิ่มมากขึ้น
สมมติว่าตอนนี้Foo
ไม่ได้เก็บString
s แต่Bar
อินสแตนซ์ของ
นั่นคือความต้องการที่พบบ่อยมาก ด้วย AssertJ การยืนยันยังง่ายต่อการเขียน ดีกว่าคุณสามารถยืนยันว่าเนื้อหารายการเท่ากันแม้ว่าคลาสขององค์ประกอบจะไม่แทนที่equals()/hashCode()
ในขณะที่วิธี JUnit ต้องการ:
import org.assertj.core.api.Assertions;
import static org.assertj.core.groups.Tuple.tuple;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add(new Bar(1, "One"), new Bar(2, "Two"), new Bar(3, "Three"));
Assertions.assertThat(foo.getElements())
.extracting(Bar::getId, Bar::getName)
.containsExactly(tuple(1, "One"),
tuple(2, "Two"),
tuple(3, "Three"));
}
assertArrayEquals
ในปัจจุบันList#toArray
การใช้งานร่วมกับ