JUnit adalah kerangka kerja standar untuk pengujian modular di ekosistem Java dan Kotlin, digunakan dalam pengembangan Android untuk memeriksa logika bisnis pada tingkat komponen yang terisolasi. Kerangka kerja ini menyediakan serangkaian anotasi, metode penegasan, dan Test Runner untuk deteksi dan eksekusi pengujian secara otomatis. Menurut JUnit.org, pustaka ini tetap menjadi solusi paling populer untuk pengujian unit di ekosistem JVM: lebih dari 70% proyek Java menggunakan JUnit dalam versi apa pun.
Hal Penting
JUnit adalah kerangka kerja sumber terbuka untuk menulis dan menjalankan pengujian unit yang dapat diulang dalam bahasa Java dan Kotlin. Ini adalah bagian dari ekosistem xUnit — keluarga kerangka kerja yang didasarkan pada arsitektur Kent Beck dan Erich Gamma, dan merupakan alat pengujian standar di Android Studio dan IntelliJ IDEA.
Tugas utama JUnit adalah mengisolasi potongan kode kecil (metode, kelas) dan memeriksa perilakunya dalam kondisi terkontrol. Pengujian ditulis sebagai kelas Java/Kotlin biasa dengan anotasi, dan kerangka kerja menangani deteksi pengujian, manajemen siklus hidup, dan pengumpulan statistik eksekusi.
Versi pertama JUnit muncul pada tahun 1997 dan secara radikal mengubah pendekatan pengembangan, mempopulerkan praktik Test-Driven Development (TDD). Saat ini JUnit 5 (Jupiter) adalah versi terkini, yang sepenuhnya dirancang ulang dengan arsitektur modular dan dukungan untuk Java 8+ dan ekstensi.
Mekanisme eksekusi JUnit didasarkan pada pola Test Runner, yang memindai classpath, menemukan metode dengan anotasi @Test, membuat instance kelas pengujian, dan menjalankan metode dalam urutan tertentu. Test Runner mengelola siklus hidup: panggilan BeforeAll → BeforeEach → Test → AfterEach → AfterAll.
JUnit membungkus setiap metode pengujian dalam instance kelas terpisah, yang menjamin isolasi antar pengujian. Ini berarti bidang kelas tidak mempertahankan status antar metode @Test yang berbeda — setiap pengujian dimulai dengan objek yang bersih.
Pengujian paling sederhana di JUnit terlihat sebagai metode dengan anotasi @Test, di dalamnya kode yang diuji dipanggil dan hasilnya diperiksa melalui penegasan. Jika penegasan gagal — pengujian dianggap gagal, dan JUnit melaporkan kesalahan.
@Test
void additionShouldReturnCorrectSum() {
var calculator = new Calculator();
var result = calculator.add(2, 3);
assertEquals(5, result);
}
Test Runner secara otomatis menemukan metode seperti itu, menjalankannya, dan melaporkan hasilnya. Jika metode tidak melempar pengecualian — pengujian lolos (green). Jika penegasan tidak berhasil — pengujian gagal (red).
Anotasi JUnit menentukan kapan dan bagaimana kode pengujian harus dijalankan. Di JUnit 5, anotasi berada dalam paket org.junit.jupiter.api dan mencakup semua tahap: persiapan data, eksekusi pengujian, pembersihan sumber daya.
| Anotasi | Tujuan | Eksekusi |
|---|---|---|
| @Test | Menandai metode pengujian | Satu kali per panggilan |
| @BeforeEach | Persiapan sebelum setiap pengujian | Sebelum setiap @Test |
| @BeforeAll | Inisialisasi satu kali kelas | Satu kali sebelum semua pengujian |
| @AfterEach | Pembersihan setelah setiap pengujian | Setelah setiap @Test |
| @AfterAll | Penyelesaian satu kali kelas | Satu kali setelah semua pengujian |
| @DisplayName | Nama pengujian yang dapat dibaca | Dekorasi |
Mari kita lihat kelas pengujian lengkap dengan siklus hidup yang benar. Metode setUp membuat instance baru Calculator sebelum setiap pengujian, dan tearDown membebaskan sumber daya — misalnya, menutup deskriptor file atau koneksi basis data.
class CalculatorTest {
private Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
void subtractionShouldReturnCorrectResult() {
int result = calculator.subtract(10, 4);
assertEquals(6, result);
}
@AfterEach
void tearDown() {
calculator.reset();
}
}
Penegasan adalah metode statis yang membandingkan hasil aktual dengan yang diharapkan dan melempar pengecualian jika tidak cocok. JUnit 5 menawarkan kelas org.junit.jupiter.api.Assertions dengan lebih dari 25 metode untuk berbagai skenario pemeriksaan — dari perbandingan nilai sederhana hingga pemeriksaan batas waktu dan penegasan kelompok.
Metode assertThrows layak mendapat perhatian khusus — metode ini memungkinkan untuk memeriksa apakah kode menangani situasi kesalahan dengan benar — pembagian dengan nol, pengiriman null, melampaui batas.
@Test
void divisionByZeroShouldThrowException() {
Calculator calc = new Calculator();
ArithmeticException exception = assertThrows(
ArithmeticException.class,
() -> calc.divide(10, 0)
);
assertEquals("Cannot divide by zero", exception.getMessage());
}
Tes berparameter memungkinkan menjalankan metode pengujian yang sama dengan kumpulan argumen berbeda. Di JUnit 5, untuk ini digunakan anotasi @ParameterizedTest dalam kombinasi dengan sumber data — @ValueSource, @CsvSource, @MethodSource, atau @EnumSource.
Pendekatan ini secara radikal mengurangi duplikasi kode: alih-alih sepuluh pengujian identik untuk nilai berbeda, satu metode berparameter ditulis. Menurut Google Testing Blog, parameterisasi mengurangi volume kode pengujian sebesar 40–60% tanpa kehilangan cakupan.
Anotasi @CsvSource mengirimkan beberapa baris dengan pemisah koma ke pengujian. Setiap baris sesuai dengan satu eksekusi pengujian. JUnit secara otomatis mengonversi nilai string ke tipe yang diperlukan: int, long, String, dan lainnya.
@ParameterizedTest
@CsvSource({
"1, 1, 2",
"2, 3, 5",
"10, 20, 30",
"-1, 1, 0"
})
void additionWithMultipleInputs(int a, int b, int expected) {
assertEquals(expected, a + b);
}
Ketika data masukan lebih kompleks dari angka atau string sederhana, @MethodSource digunakan. Ini merujuk pada metode statis yang mengembalikan Stream argumen — misalnya, Stream of Arguments atau Stream objek User untuk menguji lapisan DAO.
Dalam pengembangan Android, JUnit digunakan bersama AndroidX Test, yang menyediakan ekstensi untuk menguji Activity, Content Provider, dan komponen Android lainnya. JUnit bertanggung jawab atas pengujian unit (unit tests) yang dijalankan di JVM tanpa emulator, dan AndroidX Test untuk pengujian instrumental pada perangkat.
Untuk menghubungkan JUnit 5 di proyek Android, cukup tambahkan ketergantungan org.junit.jupiter:junit-jupiter di build.gradle tingkat modul. Plugin Gradle AGP mendukung menjalankan pengujian JUnit 5 di JVM melalui Test Runner standar.
// build.gradle.kts
android {
testOptions {
unitTests.isIncludeAndroidResources = true
}
}
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.11.0")
testImplementation("androidx.test:core-ktx:1.6.1")
}
Dalam praktiknya, JUnit paling sering digunakan untuk menguji ViewModel dan repositori — lapisan yang tidak memerlukan konteks Android atau emulator. Pengujian semacam itu dijalankan dalam milidetik dan dapat dijalankan ratusan kali tanpa kehilangan waktu.
JUnit 5 (Jupiter) bukan hanya versi baru, tetapi platform yang sepenuhnya dirancang ulang dibagi menjadi tiga modul: JUnit Platform (menjalankan pengujian di JVM), JUnit Jupiter (API untuk menulis pengujian), dan JUnit Vintage (kompatibilitas mundur dengan JUnit 4). Modularitas seperti ini memungkinkan menghubungkan berbagai Test Engine — misalnya, Spek untuk Kotlin atau TestNG.
| Karakteristik | JUnit 4 | JUnit 5 |
|---|---|---|
| Paket | org.junit | org.junit.jupiter |
| Anotasi dasar | @Test (dari junit.framework) | @Test (dari org.junit.jupiter.api) |
| Before/After | @Before, @After, @BeforeClass | @BeforeEach, @AfterEach, @BeforeAll |
| Parameterized | @RunWith(Parameterized.class) | @ParameterizedTest + @ValueSource |
| Extension | @Rule, @ClassRule | @ExtendWith, API yang lebih fleksibel |
| Java min | Java 5 | Java 8+ |
Migrasi dari JUnit 4 ke JUnit 5 tidak memerlukan penulisan ulang semua pengujian — cukup hubungkan JUnit Vintage Engine, dan pengujian lama akan terus berfungsi. Pengujian baru disarankan ditulis di JUnit 5 untuk memanfaatkan ekstensi, lambda dalam penegasan, dan dukungan bawaan untuk parameterisasi.
Pertanyaan yang sering diajukan
JUnit adalah kerangka kerja untuk menulis dan menjalankan pengujian, sedangkan Mockito adalah pustaka untuk membuat objek mock. Keduanya digunakan bersama: JUnit mengelola eksekusi pengujian, dan Mockito menggantikan ketergantungan kelas yang diuji.
Ya, JUnit 5 sepenuhnya kompatibel dengan proyek Android. Untuk pengujian unit, cukup tambahkan ketergantungan junit-jupiter di build.gradle. Pengujian instrumental masih berfungsi melalui AndroidX Test Runner.
Minimal, satu anotasi @Test sebelum metode sudah cukup. Untuk inisialisasi dan pembersihan, disarankan @BeforeEach dan @AfterEach, tetapi tidak wajib.
Test Runner adalah komponen JUnit yang memindai classpath, menemukan metode dengan anotasi @Test, membuat instance kelas pengujian, dan menjalankan pengujian. Di JUnit 5, peran ini dilakukan oleh JUnit Platform dengan Test Engine yang terhubung.
Gunakan assertThrows(Class, Executable) — ia menerima tipe pengecualian yang diharapkan dan lambda dengan panggilan metode. JUnit memeriksa bahwa pengecualian benar-benar dilempar dan mengembalikannya untuk pemeriksaan lebih lanjut.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga