junit5
จากบทความเรื่อง การเตรียมความพร้อมสำหรับ JUnit 5
ซึ่งในตอนนั้นเป็น alpha version
แต่ตอนนี้อยู่ใน version 5.0.0 M2 แล้ว
โดยสิ่งที่น่าสนใจมาก ๆ รองลงมาจาก Architecture ที่เปลี่ยนใหม่
นั่นก็คือ Annotation ต่าง ๆ ที่มีให้ใช้งานนั่นเอง
เนื่องจากมีการเปลี่ยนแปลงเยอะเหมือนกัน
ดังนั้นมาดูกันหน่อย

JUnit5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

คำอธิบาย

  • JUnit Platform คือ interface ระหว่าง JUnit กับ client tool อื่น ๆ เช่น IDE และ build tool อื่น ๆ เช่น Spock, Cucumber และ Fitness ซึ่งถูกเตรียมไว้ในสิ่งที่เรียกว่า TestEngine โดยเป็นหัวใจหลักของ JUnit5 กันเลย
  • JUnit Jupiter คือส่วนหลักของการเขียน test และการเขียน extension เพิ่มเติม แน่นอนว่าก็ทำงานผ่าน TestEngine ด้วยเช่นกัน
  • JUnit Vintage คือ TestEngine สำหรับทำงานกับ JUnit 3 และ 4

ปล. สำหรับการ import ใน JUnit 5 ต้องใช้ผ่าน org.junit.jupiter.api นะ

Annotation ใน JUnit 5 ประกอบไปด้วย

  • @TestFactory สำหรับการบอกว่า method นั้น ๆ เป็น dynamic test !!
  • @DisplayName สามารถทำการกำหนดชื่อของ test case ได้แล้ว ก่อนนี้ใช้จากชื่อ method
  • @Tag หรือป้ายชื่อเพื่อเอาไว้แบ่งกลุ่มของการทดสอบนั่นเอง และใช้ filter ได้อีกด้วย ใน version ก่อนหน้าคือ @Category
  • @BeforeEach โดย method นี้จะถูกเรียกใช้งานก่อนแต่ test case เสมอ ใน version ก่อนหน้าคือ @Before
  • @BeforeAll โดย method นี้จะถูกเรียกใช้งานครั้งเดียวก่อน test case แรกจะถูกเรียก ใน version ก่อนหน้าคือ @BeforeClass
  • @AfterEach โดย method นี้จะถูกเรียกใช้งานหลังจากที่แต่ละ test case ทำงานเสร็จสิ้น ใน version ก่อนหน้าคือ @After
  • @AfterAll โดย method นี้จะถูกเรียกใช้งานครั้งเดียวหลังจากที่ test case สุดท้ายใน class ทำงานเสร็จสิ้น ใน version ก่อนหน้าคือ @AfterClass
  • @Disable สำหรับปิดการทดสอบใน test case นั้น ๆ ใน version ก่อนหน้าคือ @Ignore
  • @ExtendWith มาแทน @RunWith, @Rule และ @ClassRule นะ

มาลองเปรียบเทียบการใช้งานของ Annotation กันหน่อย

ก่อนอื่นก็ต้องเตรียม library หรือ dependency กันก่อน
ซึ่งผมใช้ Apache Maven จัดการ

เริ่มที่ @BeforeAll/@AfterAll กับ @BeforeEach/@AfterEach
สิ่งที่ต่างกันคือ signature ของ method นั่นเอง
ไม่ต้องเป็น static method แล้วนะ

ต่อมาก็กำหนดชื่อของ test case เองด้วย @DisplayName

อยากปิด test case ไหนก็ทำไปด้วย @Disable !! ทำไปทำไม ?

ต่อมาคือ @Tag ที่ใช้งานแทน @Category

มาดูอีกเรื่องที่สำคัญคือ Exception Testing

สำหรับการตรวจสอบ exception ต่าง ๆ ของระบบงาน
ใน JUnit5 นั้นไม่มี expected หรือ Rule อีกแล้วนะ
แต่ก็มีของมาให้ใช้งานก็คือ expectThrows() กับ assertThrows()
ซึ่งจากการใช้งานก็ดูแปลก ๆ ดีเหมือนกัน
เนื่องจากเอา Lambda มาใช้งาน

สำหรับ source code ตัวอย่างอยู่ที่ Github::Up1:Demo JUnit 5

วันนี้ Java Developer พร้อมกับ JUnit 5 กันหรือยัง ?