คุณจะยืนยันความเท่าเทียมกันของCollection
องค์ประกอบอย่างรวบรัดได้อย่างไรโดยเฉพาะ a Set
ใน JUnit 4
คุณจะยืนยันความเท่าเทียมกันของCollection
องค์ประกอบอย่างรวบรัดได้อย่างไรโดยเฉพาะ a Set
ใน JUnit 4
คำตอบ:
คุณสามารถยืนยันว่าทั้งสองSet
s มีค่าเท่ากันกับอีกคนหนึ่งซึ่งเรียกวิธีการSet
equals()
public class SimpleTest {
private Set<String> setA;
private Set<String> setB;
@Before
public void setUp() {
setA = new HashSet<String>();
setA.add("Testing...");
setB = new HashSet<String>();
setB.add("Testing...");
}
@Test
public void testEqualSets() {
assertEquals( setA, setB );
}
}
สิ่งนี้@Test
จะผ่านไปหากสองSet
s มีขนาดเท่ากันและมีองค์ประกอบเดียวกัน
equals
และhashCode
นำไปใช้ในคลาสที่คุณจัดเก็บไว้ใน Hashtable หรือไม่?
Apache ร่วมกันช่วยเหลืออีกครั้ง
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
ใช้งานได้เหมือนมีเสน่ห์ ฉันไม่รู้ว่าทำไม แต่ฉันพบว่าคอลเล็กชันต่อไปนี้assertEquals(coll1, coll2)
ไม่ได้ผลเสมอไป ในกรณีที่ล้มเหลวสำหรับฉันฉันมีสองคอลเล็กชันที่ได้รับการสนับสนุนโดยชุด ทั้งแฮมเครสต์และจูนิทไม่ยอมบอกว่าคอลเลกชันเท่ากันแม้ว่าฉันจะรู้ว่ามันเป็น การใช้ CollectionUtils จะทำงานได้อย่างสมบูรณ์
กับแฮมเครสต์ :
assertThat(s1, is(s2));
ด้วยการยืนยันธรรมดา:
assertEquals(s1, s2);
หมายเหตุ: เสื้อเท่ากับ () วิธีการของระดับชุดคอนกรีตถูกนำมาใช้
กรณีที่น่าสนใจอย่างยิ่งคือเมื่อคุณเปรียบเทียบ
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
และ
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
จนถึงตอนนี้ทางออกเดียวที่ฉันเห็นคือเปลี่ยนทั้งคู่เป็นชุด
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
หรือฉันสามารถเปรียบเทียบองค์ประกอบตามองค์ประกอบ
เป็นวิธีการเพิ่มเติมที่ใช้อาร์เรย์ ... คุณสามารถพิจารณาใช้การยืนยันอาร์เรย์แบบไม่เรียงลำดับใน junitx แม้ว่าตัวอย่าง Apache CollectionUtils จะใช้งานได้ แต่ก็มีส่วนขยายการยืนยันที่มั่นคงเช่นกัน:
ผมคิดว่า
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
วิธีการจะอ่านได้ง่ายขึ้นและสามารถแก้ไขข้อบกพร่องได้มากขึ้นสำหรับคุณ (Collections ทั้งหมดรองรับ toArray () ดังนั้นจึงควรใช้เมธอด ArrayAssert ได้ง่ายพอสมควร
แน่นอนข้อเสียคือ junitx เป็นไฟล์ jar เพิ่มเติมหรือรายการ maven ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
ตรวจสอบบทความนี้ ตัวอย่างหนึ่งจากที่นั่น:
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
ใช้ Hamcrest:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
วิธีนี้ใช้ได้เช่นกันเมื่อชุดมีประเภทข้อมูลที่แตกต่างกันและรายงานเกี่ยวกับความแตกต่างแทนที่จะล้มเหลว
หากคุณต้องการตรวจสอบว่ารายการหรือชุดมีชุดของค่าเฉพาะหรือไม่ (แทนที่จะเปรียบเทียบกับคอลเล็กชันที่มีอยู่แล้ว) โดยทั่วไปวิธีการ toString ของคอลเลกชันนั้นมีประโยชน์:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
ซึ่งสั้นกว่าการสร้างคอลเล็กชันที่คาดไว้ครั้งแรกเล็กน้อยและเปรียบเทียบกับคอลเล็กชันจริงและง่ายต่อการเขียนและแก้ไข
(เป็นที่ยอมรับว่านี่ไม่ใช่วิธีการที่สะอาดโดยเฉพาะและไม่สามารถแยกแยะองค์ประกอบ "foo, bar" จากสององค์ประกอบ "foo" และ "bar" ได้ แต่ในทางปฏิบัติฉันคิดว่าสิ่งสำคัญที่สุดคือการเขียนแบบทดสอบที่ง่ายและรวดเร็ว มิฉะนั้นนักพัฒนาจำนวนมากจะไม่กดโดยไม่ต้องกด)
ฉันชอบวิธีแก้ปัญหาของ Hans-Peter Störr ... แต่ฉันคิดว่ามันไม่ถูกต้องนัก น่าเศร้าที่containsInAnyOrder
ไม่ยอมรับCollection
objetcs เพื่อเปรียบเทียบกับ ดังนั้นจึงจะต้องมีCollection
ของMatcher
s:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
การนำเข้า ได้แก่ :
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;