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 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.
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.
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 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.
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.
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 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.
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.
// 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 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.
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.
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.
@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());
}
}
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.
@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 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.
| Karakteristik | Robolectric | Emulator |
|---|---|---|
| Kecepatan | ~5 detik per 100 tes | ~5 menit per 100 tes |
| Menjalankan | Tanpa membangun APK | Memerlukan membangun APK |
| API nyata | Emulasi shadow | Android SDK native |
| Out-of-the-box | Hanya JUnit | Framework apa pun |
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.
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.
@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)
}
}
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]).
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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
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