Ang Robolectric ay isang framework para sa unit testing ng Android applications na nagbibigay-daan sa pagpapatakbo ng tests direkta sa JVM nang walang emulator o pisikal na device. Ito ay humaharang ng mga tawag sa Android SDK at nagbibigay ng shadow-object na gumagaya sa pag-uugali ng mga tunay na bahagi. Ayon sa Robolectric Documentation, 2025, ang mga shadow-object ay pumapalit sa humigit-kumulang 15 libong klase ng Android API, na tinitiyak ang paghihiwalay ng tests mula sa platform.
Mga Pangunahing Punto
Robolectric ay isang open-source framework, nilikha noong 2010 para mapabilis ang testing ng Android applications. Sa halip na tumakbo sa emulator o device, ang Robolectric ay nagbibigay ng shadow-implementations ng mga klase ng Android SDK na direktang gumagana sa Java Virtual Machine (JVM). Ito ay nagpapahintulot na magsagawa ng libu-libong tests sa loob ng segundo.
Ang tradisyonal na Android testing ay nangangailangan ng pagpapatakbo ng application sa emulator, na tumatagal ng 3–10 minuto para sa pagbuo ng APK, pag-install at pagpapatakbo. Inaalis ng Robolectric ang hakbang na ito: ang tests ay compile bilang ordinaryong Java/Kotlin tests at pinapatakbo sa pamamagitan ng JUnit. Ito ay nagbibigay ng feedback loop sa ilang segundo sa halip na minuto.
Sinusuportahan ng Robolectric ang lahat ng bersyon ng Android mula API 16 (Android 4.1) hanggang sa pinakabagong stable na bersyon. Para sa bawat bersyon, ibinibigay ang kaukulang set ng mga shadow-object na gumagaya sa pag-uugali ng partikular na bersyon ng platform kung saan sinusubok ang application.
Ang arkitektura ng Robolectric ay batay sa mekanismo ng pagharang ng mga tawag sa pamamagitan ng pagpapalit ng classloader. Kapag ang test ay tumawag ng method ng Android SDK, hinaharangan ng Robolectric ang tawag at idinidirekta ito sa shadow-object. Shadow-object ay isang Java class na gumagaya sa tunay na pag-uugali ng Android component, ngunit gumagana nang walang native platform.
Ang mga shadow-object ay nag-iimplement ng mga pangunahing method ng orihinal na Android classes. Halimbawa, ginagaya ng ShadowTextView ang mga method na getText(), setText(), getCurrentTextColor() at iba pa. Sa pagtawag ng textView.setText(“Hello”) ang shadow ay nag-iimbak ng string at ibinabalik ito sa pagtawag ng getText(). Ito ay naghihiwalay ng tests mula sa tunay na rendering at system services.
Sinusuportahan ng Robolectric ang mahigit 200 shadow-class na sumasaklaw sa mga pangunahing bahagi ng Android SDK: Activity, Fragment, TextView, Button, RecyclerView, WebView, LocationManager, ConnectivityManager at marami pang iba. Ang mga shadow-object ay sumusunod sa parehong hierarchy ng inheritance gaya ng orihinal na Android classes.
Ang pag-install ng Robolectric sa Gradle project ay nangangailangan ng pagdaragdag ng dependency na testImplementation “org.robolectric:robolectric:4.x”. Kailangan ding tukuyin ang configuration na android:sdk sa file na build.gradle at idagdag ang android:testInstrumentationRunner. Para sa paggamit ng Robolectric, hindi kailangan ang android-test plugin.
Pagkatapos idagdag ang dependency, kailangang i-configure ang directory para sa manifest, resources at assets. Awtomatikong nahahanap ng Robolectric ang AndroidManifest.xml, ngunit maaaring kailanganing manu-manong tukuyin ang path sa pamamagitan ng @Config annotation o system properties. Para sa multi-module projects, ang configuration ay itinatakda nang hiwalay para sa bawat module.
// build.gradle — configuration ng 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'
}
Ang @Config annotation ay nagpapahintulot na baguhin ang parameters ng test: sdk (bersyon ng API), manifest (path sa manifest), qualifiers (configuration ng screen, wika). Ito ay kapaki-pakinabang para sa pagsubok ng pag-uugali ng application sa iba’t ibang bersyon ng Android, oryentasyon ng screen at lokalisasyon.
Ang Robolectric tests ay isinusulat bilang ordinaryong unit tests na may @RunWith(RobolectricTestRunner.class) para sa JUnit 4 o sa pamamagitan ng RobolectricExtension para sa JUnit 5. Ang ActivityController ay namamahala sa lifecycle ng Activity: create(), start(), resume(), pause(), stop(), destroy(). Ito ay nagbibigay-daan sa detalyadong pagsubok ng bawat transition ng estado.
Para sa pagsubok ng Activity, ginagamit ang ActivityController na sunod-sunod na dumadaan sa mga yugto ng lifecycle. Ang access sa Activity ay sa pamamagitan ng controller.get(). Lahat ng view components ay accessible sa pamamagitan ng findViewById, tulad sa tunay na application. Ang mga shadow-object ay nagbibigay-daan sa pagsusuri ng mga text, visibility, kulay at iba pang attributes ng view.
@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());
}
}
Hinaharangan ng Robolectric ang mga tawag sa startActivity() at nagbibigay-daan sa pagsusuri ng mga naipadalang intent sa pamamagitan ng ShadowActivity. Ito ay nagbibigay ng kakayahang subukan ang nabigasyon: suriin na sa pag-click ng button ay may naipadalang Intent na may tamang Action, Data at Extra parameters.
@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()
);
}
Ang Robolectric at emulator ay lumulutas ng magkaibang gawain. Ang Robolectric ay mainam para sa mabilis na unit tests, pagsusuri ng UI logic, mga business component at repositories. Ang emulator ay kinakailangan para sa instrumental tests, pagsusuri ng integrasyon sa API, pagsubok ng camera, sensors at performance.
| Katangian | Robolectric | Emulator |
|---|---|---|
| Bilis | ~5 segundo sa bawat 100 tests | ~5 minuto sa bawat 100 tests |
| Pagpapatakbo | Walang pagbuo ng APK | Kailangan ang pagbuo ng APK |
| Real na API | Shadow-emulation | Native na Android SDK |
| Out-of-the-box | JUnit lang | Kahit anong framework |
Ang Robolectric ay mahusay para sa pagsubok ng ViewModel, Repository at UseCase — mga bahagi na gumagamit ng Android SDK ngunit hindi nangangailangan ng tunay na UI. Ang ViewModel ay sinusubok sa pamamagitan ng ordinaryong JUnit test na may RobolectricExtension, kung saan ang lifecycle components (LiveData, StateFlow) ay gumagana sa shadow-environment nang walang mock.
Sinusuportahan ng Robolectric ang LiveData nang diretso: maaaring mag-subscribe sa LiveData sa test, baguhin ang estado sa pamamagitan ng ViewModel at suriin ang na-emit na halaga. Para sa asynchronous operations, ginagamit ang InstantTaskExecutorRule o runBlocking para sa coroutines. Ito ay nag-aalis ng pangangailangan na i-mock ang architectural components.
@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)
}
}
Kung ang standard shadow-objects ng Robolectric ay hindi sumasaklaw sa kinakailangang Android SDK class, maaaring gumawa ng custom na Shadow. Para dito, gumagawa ng class na may @Implements(ClassName.class) annotation at i-implement ang mga kinakailangang method na may @Implementation. Ang custom shadows ay nirerehistro sa pamamagitan ng @Config(shadows = [CustomShadow::class]).
Sinusuportahan ng Robolectric ang pagsubok ng ContentProvider sa pamamagitan ng Robolectric.buildContentProvider(). Maaaring suriin ang CRUD operations, query na may URI-matching at paghawak ng access rights. Ang resources (strings, kulay, laki) ay accessible din sa pamamagitan ng RuntimeEnvironment.application.resources, na nagpapahintulot sa pagsubok ng code na umaasa sa resources.
Ang paglipat mula sa instrumental tests patungong Robolectric ay nangangailangan ng pagbabago ng approach. Ang instrumental tests (AndroidJUnit4) ay sumusuri ng tunay na pag-uugali sa emulator, Robolectric — nakahiwalay na logic sa shadow-environment. Inirerekomenda na takpan ang business logic ng Robolectric tests, at ang instrumental tests ay iwan para sa integration scenarios.
Sa migrasyon kailangan: palitan ang AndroidJUnit4 ng RobolectricTestRunner, magdagdag ng @Config na may target na bersyon ng SDK, palitan ang ActivityTestRule ng ActivityController, at ilipat ang dependencies mula androidTestImplementation papuntang testImplementation. Ang mga Mock (MockK, Mockito) ay gumagana sa Robolectric nang walang pagbabago — hindi sila umaasa sa platform.
Hindi sinusuportahan ng Robolectric ang: pagsubok ng camera (CameraX), NFC, Bluetooth, biometry, paggawa sa tunay na files at native libraries. Para sa mga scenario na ito, kinakailangan ang instrumental tests sa emulator. Hindi rin nire-reproduce ng Robolectric ang tunay na rendering — ang layout tests ay mas mainam na isagawa sa pamamagitan ng Compose Test Rule o Espresso. Gayunpaman, para sa pagsusuri ng business logic, nabigasyon at estado ng ViewModel, ganap na pinapalitan ng Robolectric ang emulator na may 10-beses na pagbilis.
Ang Robolectric ay nangangailangan ng JDK 11 o mas bago at tugma sa AGP (Android Gradle Plugin) mula 7.0 hanggang sa pinakabagong stable na bersyon. Ang SDK manager ng Robolectric ay awtomatikong nagda-download ng mga kinakailangang bersyon ng Android API sa unang pagpapatakbo — ito ay isang beses na operasyon. Para sa CI servers, inirerekomenda na i-download nang maaga ang SDK sa pamamagitan ng sdkmanager upang maiwasan ang pagkaantala sa unang pagpapatakbo ng tests. Ang pag-update ng Robolectric sa bagong bersyon ay karaniwang hindi nangangailangan ng pagbabago sa code ng tests, tanging pag-update ng numero ng dependency sa build.gradle.
Ang Robolectric ay tugma sa mga sikat na mocking frameworks: MockK para sa Kotlin at Mockito para sa Java. Ang mga Mock ay ginagamit para sa paghihiwalay ng dependencies: repositories, API clients, SharedPreferences. Ang pangunahing patakaran — huwag i-mock ang Android SDK classes, para doon ay may mga shadow-object. I-mock lamang ang mga layers ng application: UseCase, Repository, DataSource at iba pang bahagi ng business logic. Ang ganitong kombinasyon ng shadow-object at mock ay nagbibigay ng maximum flexibility na may minimal na gastos sa pagsusulat ng tests.
Mga Madalas Itanong
Ang Espresso ay isang instrumental framework na tumatakbo sa emulator o device. Ang Robolectric ay isang unit framework na gumagana sa JVM. Sinusubok ng Espresso ang tunay na pag-uugali, Robolectric — nakahiwalay na logic sa shadow-environment. Sila ay nagpupuno sa isa’t isa.
Oo, sinusuportahan ng Robolectric ang Jetpack Compose mula sa bersyon 4.8. Ang tests ng Compose components ay isinasagawa gamit ang ComposeTestRule, katulad ng sa emulator. Gayunpaman, ang Compose tests sa Robolectric ay hindi sinusuri ang tunay na rendering — tanging ang composition logic.
Sinusuportahan ng Robolectric ang multi-module projects. Ang bawat module ay naka-configure nang hiwalay na may pagtukoy ng sarili nitong manifest at resources. Para sa mga module na walang UI components, sapat na ang library module na walang android plugin. Sa malalaking project na may dose-dosenang modules, ang Robolectric tests ng bawat module ay tumatakbo nang parallel, na nagbibigay ng karagdagang bilis kumpara sa sequential na pagpapatakbo sa emulator.
Ang problema sa resources ay nangyayari kung sa build.gradle ay hindi tinukoy ang unitTests.includeAndroidResources = true o walang @Config annotation na may tamang path sa manifest. Gumagamit ang Robolectric ng mga compiled resources mula sa build/intermediates.
Ang Robolectric tests ay dini-debug tulad ng ordinaryong Java/Kotlin tests sa Android Studio. Available ang breakpoint, step-through debug, inspeksyon ng shadow-object at kanilang estado. Ang logging ay naa-activate sa pamamagitan ng -Drobolectric.logging=debug sa VM options.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din