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 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.
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.
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 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.
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.
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 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.
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.
// 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 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.
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.
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í.
@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 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.
@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 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.
| Vlastnost | Robolectric | Emulátor |
|---|---|---|
| Rychlost | ~5 sec na 100 testů | ~5 min na 100 testů |
| Spuštění | Bez sestavení APK | Vyžaduje sestavení APK |
| Reálné API | Shadow-emulace | Nativní Android SDK |
| Out-of-the-box | Pouze JUnit | Jakékoli frameworky |
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ů.
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.
@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)
}
}
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]).
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.
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.
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ě.
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.
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.
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
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í.
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.
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.
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.
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í
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í.
Přečtěte si také