CollectionAssert ใน jUnit?


คำตอบ:


126

การใช้ JUnit 4.4 คุณสามารถใช้assertThat()ร่วมกับโค้ดHamcrest ได้ (ไม่ต้องกังวลมันมาพร้อมกับ JUnit โดยไม่จำเป็นต้องใช้อุปกรณ์เสริม.jar) เพื่อสร้างคำยืนยันที่อธิบายตัวเองที่ซับซ้อนรวมถึงสิ่งที่ทำงานบนคอลเลกชัน:

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;

List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()

// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one 
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));

เมื่อใช้วิธีนี้คุณจะได้รับคำอธิบายที่ดีโดยอัตโนมัติเกี่ยวกับการยืนยันเมื่อล้มเหลว


1
โอฉันไม่รู้เลยว่าแฮมเครสต์ทำให้มันกลายเป็นจูนิทดิสโตร ไปแนท!
skaffman

หากฉันต้องการยืนยันว่า l ประกอบด้วยรายการ ("foo", "bar") แต่ไม่มีรายการอื่น - มีไวยากรณ์ที่ง่ายสำหรับสิ่งนั้นหรือไม่?
ripper234

ใช้ข้อมูลโค้ดด้านบนและส่ง assertTrue เพิ่มเติม (l.size () == 2)
aberrant80

4
ฉันน่าเกลียด ใน NUnit นั่นคือ CollectionAssert.AreEqual (คาดว่าจะมีคอลเล็กชันคอลเลคชันจริง)
ripper234

1
Google พบคำตอบ Stackoverflow อื่นที่ฉันกำลังมองหา!
Mykola Golubyev

4

ไม่โดยตรงไม่ ฉันขอแนะนำให้ใช้Hamcrestซึ่งมีชุดกฎการจับคู่ที่หลากหลายซึ่งรวมเข้ากับ jUnit (และกรอบการทดสอบอื่น ๆ )


สิ่งนี้ไม่รวบรวมด้วยเหตุผลบางประการ (ดูstackoverflow.com/questions/1092981/hamcrests-hasitems ): ArrayList <Integer> actual = ArrayList ใหม่ <Integer> (); ArrayList <Integer> คาดว่า = ArrayList ใหม่ <Integer> (); จริงเพิ่ม (1); คาดว่าเพิ่ม (2); assertThat (จริง hasItems (คาดว่า));
ripper234

2

ดู FEST Fluent Assertions IMHO ใช้งานได้สะดวกกว่า Hamcrest (และมีประสิทธิภาพเท่าเทียมกันขยายได้ ฯลฯ ) และรองรับ IDE ได้ดีกว่าด้วยอินเทอร์เฟซที่คล่องแคล่ว ดูhttps://github.com/alexruiz/fest-assert-2.x/wiki/Using-fest-assertions


ในปี 2560 ดูเหมือนว่าผู้คนจะใช้สาขาของ FEST ชื่อ AssertJ มากขึ้น
สูงสุด

2

โซลูชันของ Joachim Sauer นั้นดี แต่ไม่ได้ผลหากคุณมีความคาดหวังมากมายที่คุณต้องการตรวจสอบว่าอยู่ในผลลัพธ์ของคุณแล้ว สิ่งนี้อาจเกิดขึ้นเมื่อคุณมีความคาดหวังที่สร้างขึ้นหรือคงที่ในการทดสอบของคุณที่คุณต้องการเปรียบเทียบผลลัพธ์หรือบางทีคุณอาจมีความคาดหวังหลายอย่างที่คุณคาดว่าจะรวมเข้าด้วยกันในผลลัพธ์ ดังนั้นแทนที่จะใช้ matchers คุณสามารถใช้List::containsAllและassertTrueตัวอย่าง:

@Test
public void testMerge() {
    final List<String> expected1 = ImmutableList.of("a", "b", "c");
    final List<String> expected2 = ImmutableList.of("x", "y", "z");
    final List<String> result = someMethodToTest(); 

    assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
    assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK

    assertTrue(result.containsAll(expected1));  // works~ but has less fancy
    assertTrue(result.containsAll(expected2));  // works~ but has less fancy
}

คุณสามารถใช้hasItems(expected1.toArray(new String[expected1.size()])). มันจะทำให้คุณมีข้อความล้มเหลวที่ดีขึ้น
meustrus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.