JUnit: apa itu, konsep kunci dan cara kerjanya

Penulis: IT Sectr Diterbitkan: 2026-04-08 Waktu membaca: 8 mnt

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 — kerangka kerja sumber terbuka untuk pengujian modular kode Java dan Kotlin.
  • Anotasi — @Test, @BeforeEach, @BeforeAll mengelola siklus hidup kelas pengujian.
  • Penegasan — assertEquals, assertTrue, assertThrows memeriksa hasil yang diharapkan.
  • Tes berparameter — memungkinkan satu pengujian dengan kumpulan data masukan berbeda.
  • Test Runner — infrastruktur JUnit secara otomatis menemukan dan menjalankan semua pengujian dalam proyek.

Apa itu JUnit?

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.

Bagaimana JUnit bekerja

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.

Siklus hidup kelas pengujian

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.

Struktur dasar pengujian

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.

java
@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: siklus hidup pengujian

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.

AnotasiTujuanEksekusi
@TestMenandai metode pengujianSatu kali per panggilan
@BeforeEachPersiapan sebelum setiap pengujianSebelum setiap @Test
@BeforeAllInisialisasi satu kali kelasSatu kali sebelum semua pengujian
@AfterEachPembersihan setelah setiap pengujianSetelah setiap @Test
@AfterAllPenyelesaian satu kali kelasSatu kali setelah semua pengujian
@DisplayNameNama pengujian yang dapat dibacaDekorasi

Contoh penggunaan anotasi

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.

java
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: memeriksa hasil di JUnit

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.

  • assertEquals(expected, actual) — memeriksa kesetaraan melalui equals().
  • assertTrue(condition) — memeriksa bahwa kondisi benar.
  • assertFalse(condition) — memeriksa bahwa kondisi salah.
  • assertNotNull(object) — memeriksa bahwa objek tidak null.
  • assertNull(object) — memeriksa bahwa objek adalah null.
  • assertThrows(exception, executable) — memeriksa bahwa kode melempar pengecualian yang ditentukan.
  • assertAll(executables) — mengelompokkan beberapa pemeriksaan dan menjalankan semuanya tanpa berhenti pada kesalahan pertama.

assertThrows untuk memeriksa pengecualian

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.

java
@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 di JUnit

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.

Contoh dengan CsvSource

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.

java
@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);
}

MethodSource untuk objek kompleks

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.

Integrasi JUnit dengan proyek Android

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.

Konfigurasi Gradle

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.

kotlin
// 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")
}

Menguji ViewModel dengan JUnit

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.

  • ViewModel — memeriksa status: loading, success, error.
  • Repository — memeriksa pemetaan data dan penanganan kesalahan.
  • UseCase — memeriksa logika bisnis dengan mock ketergantungan.

JUnit 4 vs JUnit 5: perbedaan utama

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.

KarakteristikJUnit 4JUnit 5
Paketorg.junitorg.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 minJava 5Java 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

Apa perbedaan JUnit dengan Mockito?

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.

Bisakah JUnit 5 digunakan di proyek Android?

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.

Berapa jumlah minimum anotasi yang diperlukan untuk pengujian?

Minimal, satu anotasi @Test sebelum metode sudah cukup. Untuk inisialisasi dan pembersihan, disarankan @BeforeEach dan @AfterEach, tetapi tidak wajib.

Apa itu Test Runner di JUnit?

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.

Bagaimana cara memeriksa apakah metode melempar pengecualian?

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

  • JUnit — kerangka kerja pengujian unit standar untuk Java dan Kotlin, dasar ekosistem xUnit.
  • Anotasi @Test, @BeforeEach, @AfterEach mengelola siklus hidup kelas pengujian.
  • Penegasan — assertEquals, assertTrue, assertThrows memeriksa kebenaran hasil.
  • Tes berparameter dengan @CsvSource dan @MethodSource mengurangi duplikasi kode.
  • JUnit 5 — arsitektur modular dengan platform, Jupiter API, dan dukungan ekstensi.
  • Integrasi Android — JUnit bekerja di JVM melalui Test Runner standar tanpa emulator.
  • Test Runner secara otomatis mendeteksi dan menjalankan metode @Test, melaporkan hasil.

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.

Diskusikan proyek

Baca juga