Tujuan dari pengujian unit adalah untuk mengidentifikasi kesalahan dalam aplikasi sesegera mungkin. Meskipun beberapa saluran mungkin membawa Anda ke tujuan yang sama, Anda harus menggunakan rute yang paling efisien.

Suite pengujian JUnit mungkin memiliki beberapa kelas pengujian yang memerlukan data yang sama, tetapi Anda tidak dapat menggunakan kembali data pengujian. Di versi JUnit sebelumnya, pendekatan yang baik adalah membuat metode utilitas, lalu memanggil metode tersebut setiap kali kelas pengujian membutuhkan datanya.

JUnit 5 menyediakan pendekatan yang lebih efisien untuk masalah ini: injeksi ketergantungan (DI).

Apa itu Injeksi Ketergantungan?

DI adalah pola desain di mana suatu objek memasok dependensi dari objek lain. Saat Anda membangun aplikasi Java, Anda mungkin memiliki kelas yang bergantung pada objek yang dibuat oleh kelas lain untuk menjalankan fungsinya.

Sebelum injeksi ketergantungan, untuk menggunakan objek dari kelas yang berbeda, Anda harus membuat instance baru dari objek tersebut di dalam kelas yang bergantung padanya. Jadi, jika Anda memiliki beberapa kelas yang bergantung pada objek yang sama, Anda harus membuat beberapa instance di dalam kelas yang bergantung.

DI memungkinkan Anda untuk menggunakan objek di kelas dependen, tanpa membuat instance baru di kelas itu.

Injeksi Ketergantungan di JUnit 5

JUnit 5 memungkinkan Anda menyuntikkan dependensi dalam metode pengujian dan konstruktor. Ini penting karena versi kerangka kerja sebelumnya tidak mengizinkan metode pengujian atau konstruktor untuk memiliki parameter.

JUnit 5 memungkinkan Anda memasukkan parameter sebanyak yang Anda suka. Satu-satunya tangkapan adalah bahwa API ParameterResolver harus dapat menyelesaikan setiap parameter pada waktu berjalan. JUnit saat ini memiliki tiga penyelesai parameter bawaan yang digunakan secara otomatis. Untuk menggunakan penyelesai lainnya, Anda harus mendaftarkannya secara eksplisit menggunakan anotasi @ExtendWith.

Menyuntikkan Ketergantungan di JUnit

Contoh program ini menggunakan salah satu parameter bawaan JUnit (TestInfoParameterResolver), untuk mendemonstrasikan bagaimana Anda dapat menyuntikkan dependensi ke dalam Tes JUnit 5. TestInfoParameterResolver menyelesaikan objek milik antarmuka TestInfo. Jadi, JUnit 5 akan menyediakan instance antarmuka TestInfo ke metode atau konstruktor apa pun yang menggunakannya.

imporstatis org.junit.jupiter.api. Pernyataan.*;
impor org.junit.jupiter.api. Nama tampilan;
impor org.junit.jupiter.api. Tes;
impor org.junit.jupiter.api. Info Tes;

kelasInfoTestInterfaceTest{
// Memasukkan objek testInfo ke konstruktor InfoTestInterfaceTest
InfoTestInterfaceTest (TestInfo testInfo) {
assertEquals("InfoTestInterfaceTest", testInfo.getDisplayName());
}

// Menyuntikkan objek testInfo ke dalam metode
@Tes
ruang kosongtestMethodName(Info TesInfo Tes){
assertEquals("testMethodName (TestInfo)", testInfo.getDisplayName());
}

@Tes
@Nama tampilan("metode menggunakan @Nama tampilan anotasi")
ruang kosongtestMethodNameDua(Info TesInfo Tes){
assertEquals("metode menggunakan @Nama tampilan anotasi", testInfo.getDisplayName());
}
}

Tes JUnit di atas menunjukkan cara menyuntikkan objek ke konstruktor dan dua metode. Itu Info Tes JUnit antarmuka memiliki empat metode yang dapat Anda gunakan dengan objeknya.

Metode getDisplayName() adalah yang paling berguna. Ini mengembalikan nama tampilan dari metode pengujian atau konstruktor saat ini. Secara default, nama ini didasarkan pada kelas. Tetapi jika Anda menggunakan anotasi @DisplayName, metode getDisplayName() akan mengembalikan teks itu.

Kelas pengujian di atas menghasilkan laporan pengujian berikut:

Gunakan DI di Metode @Before dan @After

Ada empat jenis metode beranotasi JUnit lainnya yang mendukung dependensi. Ini adalah anotasi @BeforeAll, @BeforeEach, @AfterAll, dan @AfterEach. Seperti metode @Test, yang perlu Anda lakukan adalah meneruskan objek ke salah satu metode sebelum atau sesudah sebagai parameter, dan Anda siap melakukannya.

Anotasi @Before dan @After penting, karena juga membantu Anda mengembangkan kode pengujian yang lebih efisien. Memiliki kemampuan untuk juga menyuntikkan dependensi ke dalam metode ini akan semakin meningkatkan kode pengujian Anda.