Robolectric — co to je, principy fungování a unit testing Androidu

Autor: IT Sectr Publikováno: 2026-04-09 Doba čtení: 8 min

Robolectric je framework pro unit testing Android aplikací, který umožňuje spouštět testy přímo na JVM bez emulátoru nebo fyzického zařízení. Zachycuje volání Android SDK a poskytuje shadow-objekty, které emulují chování skutečných komponent. Podle Robolectric Documentation, 2025 nahrazují shadow-objekty přibližně 15 tisíc tříd Android API a zajišťují izolaci testů od platformy.

Hlavní body

  • Robolectric — framework pro unit testing Androidu bez emulátoru, pracující na JVM
  • Shadow-objekty zachycují volání Android SDK a emulují chování systému
  • Integrace s JUnit 4 a 5 umožňuje používat standardní testovací runner
  • Testy se provádějí v sekundách, ne v minutách jako v emulátoru
  • Podpora pro Jetpack Compose, fragmenty, intenty, ContentProvider a zdroje

Co je Robolectric

Robolectric je open-source framework, vytvořený v roce 2010 pro urychlení testování Android aplikací. Místo spouštění na emulátoru nebo zařízení poskytuje Robolectric shadow-implementace tříd Android SDK, které pracují přímo na Java Virtual Machine (JVM). To umožňuje provádět tisíce testů během sekund.

Problém, který Robolectric řeší

Tradiční Android testování vyžaduje spuštění aplikace na emulátoru, což trvá 3–10 minut na sestavení APK, instalaci a spuštění. Robolectric tento krok odstraňuje: testy se kompilují jako běžné Java/Kotlin testy a spouštějí se přes JUnit. To poskytuje zpětnou vazbu během několika sekund místo minut.

Podporované verze Androidu

Robolectric podporuje všechny verze Androidu od API 16 (Android 4.1) až po nejnovější stabilní verzi. Pro každou verzi je poskytována odpovídající sada shadow-objektů, které emulují chování právě té verze platformy, na které je aplikace testována.

Architektura a shadow-objekty

Architektura Robolectricu je založena na mechanismu zachycování volání prostřednictvím výměny classloaderu. Když test zavolá metodu Android SDK, Robolectric zachytí volání a nasměruje jej na shadow-objekt. Shadow-objekt je Java třída, která napodobuje skutečné chování Android komponenty, ale pracuje bez nativní platformy.

Jak shadow fungují

Shadow-objekty implementují klíčové metody původních Android tříd. Například ShadowTextView napodobuje metody getText(), setText(), getCurrentTextColor() a další. Při volání textView.setText(„Hello“) shadow uloží řetězec a vrátí jej při volání getText(). To izoluje testy od skutečného vykreslování a systémových služeb.

Shadow-hierarchie

Robolectric podporuje více než 200 shadow-tříd, které pokrývají hlavní komponenty Android SDK: Activity, Fragment, TextView, Button, RecyclerView, WebView, LocationManager, ConnectivityManager a mnoho dalších. Shadow-objekty následují stejnou hierarchii dědičnosti jako původní Android třídy.

Instalace a konfigurace Robolectricu

Instalace Robolectricu do projektu Gradle vyžaduje přidání závislosti testImplementation „org.robolectric:robolectric:4.x“. Také je nutné specifikovat konfiguraci android:sdk v souboru build.gradle a přidat android:testInstrumentationRunner. Pro práci s Robolectricem není vyžadován plugin android-test.

Základní konfigurace Gradle

Po přidání závislosti je třeba nakonfigurovat adresář pro manifest, zdroje a assety. Robolectric automaticky najde AndroidManifest.xml, ale může být nutné ručně zadat cestu prostřednictvím anotace @Config nebo systémových vlastností. Pro vícemodulové projekty se konfigurace nastavuje zvlášť pro každý modul.

groovy
// build.gradle — konfigurace Robolectricu
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'
}

Anotace @Config

Anotace @Config umožňuje přepsat parametry testu: sdk (verze API), manifest (cesta k manifestu), qualifiers (konfigurace obrazovky, jazyk). To je užitečné pro testování chování aplikace na různých verzích Androidu, orientacích obrazovky a lokalizacích.

Psaní testů s Robolectricem

Testy Robolectricu se píší jako běžné unit testy s @RunWith(RobolectricTestRunner.class) pro JUnit 4 nebo přes RobolectricExtension pro JUnit 5. ActivityController spravuje životní cyklus Activity: create(), start(), resume(), pause(), stop(), destroy(). To umožňuje detailně testovat každý přechod stavu.

Testování Activity

Pro testování Activity se používá ActivityController, který postupně prochází fázemi životního cyklu. Přístup k Activity je přes controller.get(). Všechny komponenty zobrazení jsou přístupné přes findViewById, jako ve skutečné aplikaci. Shadow-objekty umožňují kontrolovat texty, viditelnost, barvy a další atributy zobrazení.

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

Testování intentů a navigace

Robolectric zachycuje volání startActivity() a umožňuje kontrolovat odeslané intenty přes ShadowActivity. To poskytuje možnost testovat navigaci: ověřit, že při kliknutí na tlačítko je odeslán Intent se správným Action, Data a Extra parametry.

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 versus emulátor

Robolectric a emulátor řeší různé úkoly. Robolectric je ideální pro rychlé unit testy, kontrolu logiky UI, obchodních komponent a repozitářů. Emulátor je nezbytný pro instrumentační testy, kontrolu integrace s API, testování kamery, senzorů a výkonu.

VlastnostRobolectricEmulátor
Rychlost~5 sec na 100 testů~5 min na 100 testů
SpuštěníBez sestavení APKVyžaduje sestavení APK
Reálné APIShadow-emulaceNativní Android SDK
Out-of-the-boxPouze JUnitJakékoli frameworky

Testování ViewModel a Repository

Robolectric je skvělý pro testování ViewModel, Repository a UseCase — komponent, které používají Android SDK, ale nevyžadují skutečné UI. ViewModel se testuje přes běžný JUnit test s RobolectricExtension, přičemž komponenty životního cyklu (LiveData, StateFlow) pracují v shadow-prostředí bez mocků.

Testování LiveData

Robolectric podporuje LiveData rovnou z krabice: lze se přihlásit k odběru LiveData v testu, změnit stav přes ViewModel a zkontrolovat emitovanou hodnotu. Pro asynchronní operace se používá InstantTaskExecutorRule nebo runBlocking pro korutiny. To eliminuje potřebu mockovat architektonické komponenty.

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

Vlastní shadow-objekty

Pokud standardní shadow-objekty Robolectricu nepokrývají potřebnou třídu Android SDK, lze vytvořit vlastní Shadow. K tomu se vytvoří třída s anotací @Implements(ClassName.class) a implementují se potřebné metody s @Implementation. Vlastní shadowy se registrují přes @Config(shadows = [CustomShadow::class]).

Testování ContentProvider a Resources

Robolectric podporuje testování ContentProvider přes Robolectric.buildContentProvider(). Lze kontrolovat CRUD operace, dotazy s párováním URI a zpracování přístupových práv. Zdroje (řetězce, barvy, rozměry) jsou také přístupné přes RuntimeEnvironment.application.resources, což umožňuje testovat kód závislý na zdrojích.

Migrace z emulátoru na Robolectric

Přechod z instrumentačních testů na Robolectric vyžaduje změnu přístupu. Instrumentační testy (AndroidJUnit4) kontrolují skutečné chování na emulátoru, Robolectric — izolovanou logiku v shadow-prostředí. Doporučuje se pokrýt obchodní logiku testy Robolectricu a instrumentační testy ponechat pro integrační scénáře.

Adaptace stávajících testů

Při migraci je třeba: nahradit AndroidJUnit4 za RobolectricTestRunner, přidat @Config s cílovou verzí SDK, nahradit ActivityTestRule za ActivityController a přesunout závislosti z androidTestImplementation do testImplementation. Mocky (MockK, Mockito) fungují s Robolectricem beze změn — nejsou závislé na platformě.

Omezení při migraci

Robolectric nepodporuje: testování kamery (CameraX), NFC, Bluetooth, biometrie, práci s reálnými soubory a nativními knihovnami. Pro tyto scénáře jsou nutné instrumentační testy na emulátoru. Robolectric také nereprodukuje skutečné vykreslování — testy rozvržení je lepší provádět přes Compose Test Rule nebo Espresso. Pro kontrolu obchodní logiky, navigace a stavů ViewModel však Robolectric zcela nahrazuje emulátor s 10násobným zrychlením běhu.

Kompatibilita s verzemi Java a Kotlin

Robolectric vyžaduje JDK 11 nebo novější a je kompatibilní s AGP (Android Gradle Plugin) od 7.0 do nejnovější stabilní verze. Správce SDK Robolectricu automaticky stahuje potřebné verze Android API při prvním spuštění — to je jednorázová operace. Pro CI servery se doporučuje předem stáhnout SDK přes sdkmanager, aby se předešlo zpožděním při prvním spuštění testů. Aktualizace Robolectricu na novou verzi obvykle nevyžaduje změny v kódu testů, pouze aktualizaci čísla závislosti v build.gradle.

Integrace s MockK a Mockito

Robolectric je kompatibilní s populárními mocking frameworky: MockK pro Kotlin a Mockito pro Javu. Mocky se používají k izolaci závislostí: repozitářů, API klientů, SharedPreferences. Hlavní pravidlo — nemockovat třídy Android SDK, k tomu slouží shadow-objekty. Mockujte pouze vrstvy aplikace: UseCase, Repository, DataSource a další komponenty obchodní logiky. Taková kombinace shadow-objektů a mocků poskytuje maximální flexibilitu při minimálních nákladech na psaní testů.

Často kladené otázky

Čím se liší Robolectric od Espressa?

Espresso je instrumentační framework, který běží na emulátoru nebo zařízení. Robolectric je unit framework pracující na JVM. Espresso testuje skutečné chování, Robolectric — izolovanou logiku v shadow-prostředí. Vzájemně se doplňují.

Lze testovat Jetpack Compose s Robolectricem?

Ano, Robolectric podporuje Jetpack Compose od verze 4.8. Testy Compose komponent se provádějí pomocí ComposeTestRule, podobně jako v emulátoru. Nicméně Compose testy na Robolectricu nekontrolují skutečné vykreslování — pouze logiku kompozice.

Jak Robolectric pracuje s moduly Gradle?

Robolectric podporuje vícemodulové projekty. Každý modul se konfiguruje samostatně s uvedením vlastního manifestu a zdrojů. Pro moduly bez UI komponent stačí knihovní modul bez android pluginu. Ve velkých projektech s desítkami modulů se Robolectric testy každého modulu spouštějí paralelně, což poskytuje další rychlostní výhodu oproti sekvenčnímu běhu na emulátoru.

Proč Robolectric nemůže najít zdroje?

Problém se zdroji nastává, pokud v build.gradle není uvedeno unitTests.includeAndroidResources = true nebo chybí anotace @Config se správnou cestou k manifestu. Robolectric používá zkompilované zdroje z build/intermediates.

Jak ladit Robolectric testy?

Robolectric testy se ladí jako běžné Java/Kotlin testy v Android Studio. K dispozici je breakpoint, step-through debug, inspekce shadow-objektů a jejich stavu. Logování se zapíná přes -Drobolectric.logging=debug v možnostech VM.

Shrnutí

  • Robolectric — framework pro rychlé unit testování Androidu na JVM bez emulátoru
  • Shadow-objekty nahrazují přes 200 tříd Android SDK a emulují jejich chování
  • Životní cyklus Activity a Fragmentu je řízen přes ActivityController s kontrolou stavů
  • Testování intentů přes ShadowActivity umožňuje kontrolovat navigaci a přenos dat
  • Integrace s JUnit a Gradle nevyžaduje další instrumentační runner
  • Anotace @Config určuje verzi API, jazyk, konfiguraci obrazovky a zdroje
  • Robolectric a Espresso se doplňují: rychlé unit testy versus instrumentační testy

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také