Robolectric — ano ito, mga prinsipyo ng trabaho at unit testing ng Android

May-akda: IT Sectr Nai-publish: 2026-04-09 Oras ng pagbabasa: 8 min

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 — framework para sa unit testing ng Android nang walang emulator, gumagana sa JVM
  • Mga shadow-object humaharang ng mga tawag sa Android SDK at gumagaya ng pag-uugali ng system
  • Integrasyon sa JUnit 4 at 5 ay nagbibigay-daan sa paggamit ng standard test runners
  • Mga tests ay naisasagawa sa segundo, hindi minuto tulad sa emulator
  • Suporta para sa Jetpack Compose, fragments, intents, ContentProvider at resources

Ano ang Robolectric

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 problemang nilulutas ng Robolectric

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.

Mga suportadong bersyon ng Android

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.

Arkitektura at mga shadow-object

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.

Paano gumagana ang shadow

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.

Shadow-hierarchy

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.

Pag-install at configuration ng Robolectric

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.

Basic na Gradle configuration

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.

groovy
// 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'
}

@Config annotation

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.

Pagsusulat ng tests gamit ang Robolectric

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.

Pagsubok ng Activity

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.

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());
    }
}

Pagsubok ng intents at nabigasyon

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.

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 laban sa emulator

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.

KatangianRobolectricEmulator
Bilis~5 segundo sa bawat 100 tests~5 minuto sa bawat 100 tests
PagpapatakboWalang pagbuo ng APKKailangan ang pagbuo ng APK
Real na APIShadow-emulationNative na Android SDK
Out-of-the-boxJUnit langKahit anong framework

Pagsubok ng ViewModel at Repository

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.

Pagsubok ng LiveData

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.

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)
    }
}

Custom shadow-objects

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]).

Pagsubok ng ContentProvider at Resources

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.

Migrasyon mula sa emulator patungong Robolectric

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.

Pag-adapt ng umiiral na tests

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.

Mga limitasyon sa migrasyon

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.

Pagkakatugma sa mga bersyon ng Java at Kotlin

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.

Integrasyon sa MockK at Mockito

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

Ano ang pagkakaiba ng Robolectric sa Espresso?

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.

Maaari bang subukan ang Jetpack Compose gamit ang Robolectric?

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.

Paano gumagana ang Robolectric sa Gradle modules?

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.

Bakit hindi mahanap ng Robolectric ang resources?

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.

Paano i-debug ang Robolectric tests?

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

  • Robolectric — framework para sa mabilis na unit testing ng Android sa JVM nang walang emulator
  • Mga shadow-object pumapalit sa mahigit 200 Android SDK classes, gumagaya sa kanilang pag-uugali
  • Lifecycle ng Activity at Fragment ay pinamamahalaan sa pamamagitan ng ActivityController na may pagsusuri ng estado
  • Pagsubok ng intent sa pamamagitan ng ShadowActivity ay nagpapahintulot sa pagsusuri ng nabigasyon at paglipat ng data
  • Integrasyon sa JUnit at Gradle ay hindi nangangailangan ng karagdagang instrumental runners
  • @Config annotation ay tumutukoy ng bersyon ng API, wika, configuration ng screen at resources
  • Robolectric at Espresso nagpupuno sa isa’t isa: mabilis na unit tests laban sa instrumental tests

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.

Pag-usapan ang proyekto

Basahin din