มี jUnit ขนานกับ NUnit CollectionAssert
หรือไม่?
มี jUnit ขนานกับ NUnit CollectionAssert
หรือไม่?
คำตอบ:
การใช้ 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"))));
เมื่อใช้วิธีนี้คุณจะได้รับคำอธิบายที่ดีโดยอัตโนมัติเกี่ยวกับการยืนยันเมื่อล้มเหลว
ไม่โดยตรงไม่ ฉันขอแนะนำให้ใช้Hamcrestซึ่งมีชุดกฎการจับคู่ที่หลากหลายซึ่งรวมเข้ากับ jUnit (และกรอบการทดสอบอื่น ๆ )
ดู FEST Fluent Assertions IMHO ใช้งานได้สะดวกกว่า Hamcrest (และมีประสิทธิภาพเท่าเทียมกันขยายได้ ฯลฯ ) และรองรับ IDE ได้ดีกว่าด้วยอินเทอร์เฟซที่คล่องแคล่ว ดูhttps://github.com/alexruiz/fest-assert-2.x/wiki/Using-fest-assertions
โซลูชันของ 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()]))
. มันจะทำให้คุณมีข้อความล้มเหลวที่ดีขึ้น