Robolectric — apa itu, prinsip kerja dan pengujian unit Android

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

Robolectric adalah framework untuk pengujian unit aplikasi Android yang memungkinkan menjalankan tes langsung di JVM tanpa emulator atau perangkat fisik. Ia mencegat panggilan Android SDK dan menyediakan objek shadow yang mengemulasi perilaku komponen nyata. Menurut Robolectric Documentation, 2025, objek shadow menggantikan sekitar 15 ribu kelas Android API, memastikan isolasi tes dari platform.

Poin Utama

  • Robolectric — framework pengujian unit Android tanpa emulator, bekerja di JVM
  • Objek shadow mencegat panggilan Android SDK dan mengemulasi perilaku sistem
  • Integrasi dengan JUnit 4 dan 5 memungkinkan penggunaan runner tes standar
  • Tes dijalankan dalam hitungan detik, bukan menit seperti di emulator
  • Dukungan untuk Jetpack Compose, fragmen, intent, ContentProvider dan sumber daya

Apa itu Robolectric

Robolectric adalah framework open-source, dibuat pada tahun 2010 untuk mempercepat pengujian aplikasi Android. Alih-alih berjalan di emulator atau perangkat, Robolectric menyediakan implementasi shadow dari kelas Android SDK yang bekerja langsung di Java Virtual Machine (JVM). Ini memungkinkan menjalankan ribuan tes dalam hitungan detik.

Masalah yang dipecahkan Robolectric

Pengujian Android tradisional memerlukan menjalankan aplikasi di emulator, yang membutuhkan 3–10 menit untuk membangun APK, instalasi dan menjalankan. Robolectric menghilangkan langkah ini: tes dikompilasi sebagai tes Java/Kotlin biasa dan dijalankan melalui JUnit. Ini memberikan siklus umpan balik dalam beberapa detik, bukan menit.

Versi Android yang didukung

Robolectric mendukung semua versi Android mulai dari API 16 (Android 4.1) hingga versi stabil terbaru. Untuk setiap versi, disediakan seperangkat objek shadow yang sesuai yang mengemulasi perilaku versi platform tempat aplikasi diuji.

Arsitektur dan objek shadow

Arsitektur Robolectric didasarkan pada mekanisme pencegatan panggilan melalui penggantian classloader. Ketika tes memanggil metode Android SDK, Robolectric mencegat panggilan dan mengarahkannya ke objek shadow. Objek shadow adalah kelas Java yang meniru perilaku nyata komponen Android, tetapi bekerja tanpa platform native.

Bagaimana cara kerja shadow

Objek shadow mengimplementasikan metode kunci dari kelas Android asli. Misalnya, ShadowTextView meniru metode getText(), setText(), getCurrentTextColor() dan lainnya. Saat textView.setText(“Hello”) dipanggil, shadow menyimpan string dan mengembalikannya saat getText() dipanggil. Ini mengisolasi tes dari rendering nyata dan layanan sistem.

Hierarki shadow

Robolectric mendukung lebih dari 200 kelas shadow yang mencakup komponen utama Android SDK: Activity, Fragment, TextView, Button, RecyclerView, WebView, LocationManager, ConnectivityManager dan banyak lainnya. Objek shadow mengikuti hierarki pewarisan yang sama dengan kelas Android asli.

Instalasi dan konfigurasi Robolectric

Instalasi Robolectric di proyek Gradle memerlukan penambahan dependensi testImplementation “org.robolectric:robolectric:4.x”. Juga perlu menentukan konfigurasi android:sdk di file build.gradle dan menambahkan android:testInstrumentationRunner. Untuk bekerja dengan Robolectric, plugin android-test tidak diperlukan.

Konfigurasi dasar Gradle

Setelah menambahkan dependensi, perlu mengonfigurasi direktori untuk manifest, sumber daya, dan aset. Robolectric secara otomatis menemukan AndroidManifest.xml, tetapi mungkin perlu menentukan jalur secara manual melalui anotasi @Config atau properti sistem. Untuk proyek multi-modul, konfigurasi diatur terpisah untuk setiap modul.

groovy
// build.gradle — konfigurasi Robolectric
android {
    testOptions {
        unitTests.includeAndroidResources = true
        unitTests.all {
            systemProperty 'robolectric.dependency.dir',
                project.rootDir.absolutePath + '/build/intermediates'
        }
    }
}

dependencies {
    testImplementation 'org.robolectric:robolectric:4.13'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0'
}

Anotasi @Config

Anotasi @Config memungkinkan mengganti parameter tes: sdk (versi API), manifest (jalur ke manifest), qualifiers (konfigurasi layar, bahasa). Ini berguna untuk menguji perilaku aplikasi pada berbagai versi Android, orientasi layar, dan lokalisasi.

Menulis tes dengan Robolectric

Tes Robolectric ditulis sebagai tes unit biasa dengan @RunWith(RobolectricTestRunner.class) untuk JUnit 4 atau melalui RobolectricExtension untuk JUnit 5. ActivityController mengelola siklus hidup Activity: create(), start(), resume(), pause(), stop(), destroy(). Ini memungkinkan pengujian detail setiap transisi status.

Menguji Activity

Untuk menguji Activity, digunakan ActivityController yang secara berurutan melewati tahapan siklus hidup. Akses ke Activity dilakukan melalui controller.get(). Semua komponen tampilan dapat diakses melalui findViewById, seperti di aplikasi nyata. Objek shadow memungkinkan pemeriksaan teks, visibilitas, warna, dan atribut tampilan lainnya.

java
@RunWith(RobolectricTestRunner.class)
@Config(sdk = BuildConfig.SDK_INT)
public class MainActivityTest {

    @Test
    public void testActivityDisplaysGreeting() {
        ActivityController<MainActivity> controller =
            Robolectric.buildActivity(MainActivity.class);
        controller.create().start().resume();

        MainActivity activity = controller.get();
        TextView greeting = activity.findViewById(R.id.greeting);
        ShadowTextView shadow = Shadows.shadowOf(greeting);

        assertEquals("Welcome!", shadow.getText());
    }
}

Menguji intent dan navigasi

Robolectric mencegat panggilan startActivity() dan memungkinkan pemeriksaan intent yang dikirim melalui ShadowActivity. Ini memberikan kemampuan untuk menguji navigasi: memeriksa bahwa saat tombol diklik, Intent dengan Action, Data, dan parameter Extra yang benar dikirim.

java
@Test
public void testNavigationToDetails() {
    controller.create().start().resume();
    MainActivity activity = controller.get();

    activity.findViewById(R.id.detailsButton).performClick();

    ShadowActivity shadowActivity = Shadows.shadowOf(activity);
    Intent intent = shadowActivity.getNextStartedActivity();
    assertEquals(
        DetailsActivity.class.getName(),
        intent.getComponent().getClassName()
    );
}

Robolectric vs emulator

Robolectric dan emulator menyelesaikan tugas yang berbeda. Robolectric ideal untuk tes unit cepat, pemeriksaan logika UI, komponen bisnis, dan repositori. Emulator diperlukan untuk tes instrumental, pemeriksaan integrasi dengan API, pengujian kamera, sensor, dan kinerja.

KarakteristikRobolectricEmulator
Kecepatan~5 detik per 100 tes~5 menit per 100 tes
MenjalankanTanpa membangun APKMemerlukan membangun APK
API nyataEmulasi shadowAndroid SDK native
Out-of-the-boxHanya JUnitFramework apa pun

Menguji ViewModel dan Repository

Robolectric sangat cocok untuk menguji ViewModel, Repository, dan UseCase — komponen yang menggunakan Android SDK tetapi tidak memerlukan UI nyata. ViewModel diuji melalui tes JUnit biasa dengan RobolectricExtension, di mana komponen siklus hidup (LiveData, StateFlow) bekerja di lingkungan shadow tanpa mock.

Menguji LiveData

Robolectric mendukung LiveData langsung: dapat berlangganan ke LiveData dalam tes, mengubah status melalui ViewModel dan memeriksa nilai yang dipancarkan. Untuk operasi asinkron, digunakan InstantTaskExecutorRule atau runBlocking untuk coroutine. Ini menghilangkan kebutuhan untuk membuat mock komponen arsitektur.

kotlin
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [BuildConfig.SDK_INT])
class ProfileViewModelTest {

    private val repository = FakeUserRepository()
    private val viewModel = ProfileViewModel(repository)

    @Test
    fun `loading profile sets state to success`() = runBlocking {
        viewModel.loadProfile("user123")
        val state = viewModel.profileState.getOrAwaitValue()
        Assertions.assertTrue(state is UiState.Success)
    }
}

Objek shadow kustom

Jika objek shadow standar Robolectric tidak mencakup kelas Android SDK yang diperlukan, dapat dibuat Shadow kustom. Untuk ini, dibuat kelas dengan anotasi @Implements(ClassName.class) dan mengimplementasikan metode yang diperlukan dengan @Implementation. Shadow kustom didaftarkan melalui @Config(shadows = [CustomShadow::class]).

Menguji ContentProvider dan Resources

Robolectric mendukung pengujian ContentProvider melalui Robolectric.buildContentProvider(). Operasi CRUD, query dengan pencocokan URI, dan penanganan hak akses dapat diperiksa. Sumber daya (string, warna, ukuran) juga tersedia melalui RuntimeEnvironment.application.resources, memungkinkan pengujian kode yang bergantung pada sumber daya.

Migrasi dari emulator ke Robolectric

Beralih dari tes instrumental ke Robolectric memerlukan perubahan pendekatan. Tes instrumental (AndroidJUnit4) memeriksa perilaku nyata di emulator, Robolectric — logika terisolasi di lingkungan shadow. Disarankan untuk menutupi logika bisnis dengan tes Robolectric, dan tes instrumental disimpan untuk skenario integrasi.

Adaptasi tes yang ada

Saat migrasi perlu: mengganti AndroidJUnit4 dengan RobolectricTestRunner, menambahkan @Config dengan versi SDK target, mengganti ActivityTestRule dengan ActivityController, dan memindahkan dependensi dari androidTestImplementation ke testImplementation. Mock (MockK, Mockito) bekerja dengan Robolectric tanpa perubahan — mereka tidak bergantung pada platform.

Keterbatasan saat migrasi

Robolectric tidak mendukung: pengujian kamera (CameraX), NFC, Bluetooth, biometri, bekerja dengan file nyata dan pustaka native. Untuk skenario ini, diperlukan tes instrumental di emulator. Robolectric juga tidak mereproduksi rendering nyata — tes tata letak lebih baik dilakukan melalui Compose Test Rule atau Espresso. Namun untuk memeriksa logika bisnis, navigasi, dan status ViewModel, Robolectric sepenuhnya menggantikan emulator dengan percepatan 10 kali lipat.

Kompatibilitas dengan versi Java dan Kotlin

Robolectric memerlukan JDK 11 atau lebih baru dan kompatibel dengan AGP (Android Gradle Plugin) dari 7.0 hingga versi stabil terbaru. Manajer SDK Robolectric secara otomatis mengunduh versi Android API yang diperlukan saat pertama kali dijalankan — ini adalah operasi satu kali. Untuk server CI, disarankan mengunduh SDK terlebih dahulu melalui sdkmanager untuk menghindari penundaan saat pertama kali menjalankan tes. Memperbarui Robolectric ke versi baru biasanya tidak memerlukan perubahan dalam kode tes, hanya memperbarui nomor dependensi di build.gradle.

Integrasi dengan MockK dan Mockito

Robolectric kompatibel dengan framework mocking populer: MockK untuk Kotlin dan Mockito untuk Java. Mock digunakan untuk isolasi dependensi: repositori, klien API, SharedPreferences. Aturan utama — jangan membuat mock kelas Android SDK, untuk itu ada objek shadow. Mock hanya lapisan aplikasi: UseCase, Repository, DataSource, dan komponen logika bisnis lainnya. Kombinasi objek shadow dan mock ini memberikan fleksibilitas maksimal dengan biaya minimal untuk menulis tes.

Pertanyaan yang Sering Diajukan

Apa perbedaan Robolectric dengan Espresso?

Espresso adalah framework instrumental yang berjalan di emulator atau perangkat. Robolectric adalah framework unit yang bekerja di JVM. Espresso menguji perilaku nyata, Robolectric — logika terisolasi di lingkungan shadow. Mereka saling melengkapi.

Bisakah Jetpack Compose diuji dengan Robolectric?

Ya, Robolectric mendukung Jetpack Compose mulai versi 4.8. Tes komponen Compose dilakukan dengan ComposeTestRule, mirip dengan emulator. Namun tes Compose di Robolectric tidak memeriksa rendering nyata — hanya logika komposisi.

Bagaimana Robolectric bekerja dengan modul Gradle?

Robolectric mendukung proyek multi-modul. Setiap modul dikonfigurasi secara terpisah dengan menentukan manifest dan sumber dayanya sendiri. Untuk modul tanpa komponen UI, modul pustaka tanpa plugin android sudah cukup. Dalam proyek besar dengan puluhan modul, tes Robolectric setiap modul berjalan paralel, memberikan keuntungan kecepatan tambahan dibandingkan eksekusi berurutan di emulator.

Mengapa Robolectric mungkin tidak dapat menemukan sumber daya?

Masalah dengan sumber daya muncul jika di build.gradle tidak ditentukan unitTests.includeAndroidResources = true atau tidak ada anotasi @Config dengan jalur yang benar ke manifest. Robolectric menggunakan sumber daya yang dikompilasi dari build/intermediates.

Bagaimana cara men-debug tes Robolectric?

Tes Robolectric di-debug seperti tes Java/Kotlin biasa di Android Studio. Breakpoint, step-through debug, inspeksi objek shadow dan statusnya tersedia. Logging diaktifkan melalui -Drobolectric.logging=debug di opsi VM.

Kesimpulan

  • Robolectric — framework untuk pengujian unit Android cepat di JVM tanpa emulator
  • Objek shadow menggantikan lebih dari 200 kelas Android SDK, mengemulasi perilakunya
  • Siklus hidup Activity dan Fragment dikelola melalui ActivityController dengan pemeriksaan status
  • Pengujian intent melalui ShadowActivity memungkinkan pemeriksaan navigasi dan transfer data
  • Integrasi dengan JUnit dan Gradle tidak memerlukan runner instrumental tambahan
  • Anotasi @Config menentukan versi API, bahasa, konfigurasi layar, dan sumber daya
  • Robolectric dan Espresso saling melengkapi: tes unit cepat vs tes instrumental

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