Robolectric, Android uygulamaları için birim test framework'üdür ve testlerin emülatör veya fiziksel cihaz olmadan doğrudan JVM üzerinde çalıştırılmasını sağlar. Android SDK çağrılarını keser ve gerçek bileşenlerin davranışını taklit eden shadow nesneleri sağlar. Robolectric Documentation, 2025'e göre, shadow nesneleri yaklaşık 15 bin Android API sınıfını değiştirerek testlerin platformdan izole edilmesini sağlar.
Ana Noktalar
Robolectric, 2010 yılında Android uygulama testlerini hızlandırmak için oluşturulmuş açık kaynaklı bir framework'tür. Bir emülatör veya cihazda çalışmak yerine, Robolectric doğrudan Java Sanal Makinesi (JVM) üzerinde çalışan Android SDK sınıflarının shadow uygulamalarını sağlar. Bu, saniyeler içinde binlerce testin çalıştırılmasına olanak tanır.
Geleneksel Android testi, uygulamanın bir emülatör üzerinde çalıştırılmasını gerektirir ve APK oluşturma, yükleme ve başlatma 3–10 dakika sürer. Robolectric bu adımı ortadan kaldırır: testler normal Java/Kotlin testleri olarak derlenir ve JUnit aracılığıyla çalıştırılır. Bu, dakikalar yerine saniyeler içinde geri bildirim döngüsü sağlar.
Robolectric, API 16'dan (Android 4.1) en son kararlı sürüme kadar tüm Android sürümlerini destekler. Her sürüm için, uygulamanın test edildiği platform sürümünün davranışını taklit eden ilgili bir shadow nesnesi seti sağlanır.
Robolectric mimarisi, sınıf yükleyici değiştirme yoluyla çağrıları kesme mekanizmasına dayanır. Bir test Android SDK metodunu çağırdığında, Robolectric çağrıyı keser ve bir shadow nesnesine yönlendirir. Bir shadow nesnesi, bir Android bileşeninin gerçek davranışını taklit eden ancak yerel platform olmadan çalışan bir Java sınıfıdır.
Shadow nesneleri, orijinal Android sınıflarının temel yöntemlerini uygular. Örneğin, ShadowTextView getText(), setText(), getCurrentTextColor() ve diğer yöntemleri taklit eder. textView.setText("Merhaba") çağrıldığında, shadow dizeyi kaydeder ve getText() çağrıldığında geri döndürür. Bu, testleri gerçek oluşturma ve sistem hizmetlerinden izole eder.
Robolectric, Android SDK'nın ana bileşenlerini kapsayan 200'den fazla shadow sınıfını destekler: Activity, Fragment, TextView, Button, RecyclerView, WebView, LocationManager, ConnectivityManager ve daha birçokları. Shadow nesneleri, orijinal Android sınıflarıyla aynı kalıtım hiyerarşisini izler.
Robolectric'i bir Gradle projesine kurmak için testImplementation "org.robolectric:robolectric:4.x" bağımlılığını eklemek gerekir. Ayrıca build.gradle dosyasında androidsdk yapılandırmasını belirtmek ve android:testInstrumentationRunner çözünürlüğünü eklemek gerekir. Robolectric ile çalışmak için Android test eklentisi gerekmez.
Bağımlılığı ekledikten sonra, manifest, kaynaklar ve varlıklar için dizini yapılandırmak gerekir. Robolectric AndroidManifest.xml'i otomatik olarak bulur, ancak @Config notu veya sistem özellikleri aracılığıyla yolu manuel olarak belirtmek gerekebilir. Çok modüllü projeler için yapılandırma her modül için ayrı ayrı ayarlanır.
// build.gradle — Robolectric yapılandırması
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 notu, test parametrelerini geçersiz kılmaya izin verir: sdk (API sürümü), manifest (manifest yolu), qualifiers (ekran yapılandırması, dil). Bu, uygulama davranışını farklı Android sürümlerinde, ekran yönlerinde ve yerelleştirmelerde test etmek için kullanışlıdır.
Robolectric testleri, JUnit 4 için @RunWith(RobolectricTestRunner.class) veya JUnit 5 için RobolectricExtension ile normal birim testleri olarak yazılır. ActivityController, Activity yaşam döngüsünü yönetir: create(), start(), resume(), pause(), stop(), destroy(). Bu, her durum geçişini ayrıntılı olarak test etmeyi sağlar.
Bir Activity'yi test etmek için, yaşam döngüsü aşamalarından sırayla geçen ActivityController kullanılır. Activity'ye erişim controller.get() aracılığıyla sağlanır. Tüm görünüm bileşenlerine, gerçek bir uygulamada olduğu gibi findViewById aracılığıyla erişilebilir. Shadow nesneleri, metinleri, görünürlüğü, renkleri ve diğer görünüm özelliklerini kontrol etmeyi sağlar.
@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, startActivity() çağrılarını keser ve ShadowActivity aracılığıyla gönderilen intent'leri kontrol etmeyi sağlar. Bu, navigasyonu test etmeyi mümkün kılar: bir düğmeye tıklandığında doğru Action, Data ve Extra parametrelerine sahip bir Intent'in gönderildiğini doğrulama.
@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 ve emülatör farklı görevleri çözer. Robolectric, hızlı birim testleri, UI mantığı, iş bileşenleri ve depoların kontrolü için idealdir. Emülatör, enstrümantasyon testleri, API ile entegrasyon kontrolü, kamera, sensörler ve performans testleri için gereklidir.
| Özellik | Robolectric | Emülatör |
|---|---|---|
| Hız | 100 testte ~5 saniye | 100 testte ~5 dakika |
| Başlatma | APK derlemesi gerekmez | APK derlemesi gerekir |
| Gerçek API | Shadow taklidi | Yerel Android SDK |
| Kullanıma hazır | Sadece JUnit | Herhangi bir framework |
Robolectric, Android SDK'yı kullanan ancak gerçek bir kullanıcı arayüzü gerektirmeyen ViewModel, Repository ve UseCase bileşenlerini test etmek için mükemmeldir. ViewModel, RobolectricExtension ile normal bir JUnit testi aracılığıyla test edilirken, yaşam döngüsü bileşenleri (LiveData, StateFlow) mock olmadan shadow ortamında çalışır.
Robolectric, LiveData'yı doğrudan destekler: testte LiveData'ya abone olabilir, ViewModel aracılığıyla durumu değiştirebilir ve yayımlanan değeri kontrol edebilirsiniz. Zaman uyumsuz işlemler için InstantTaskExecutorRule veya coroutine'ler için runBlocking kullanılır. Bu, mimari bileşenleri mock'lama ihtiyacını ortadan kaldırır.
@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)
}
}
Standart Robolectric shadow nesneleri gerekli bir Android SDK sınıfını kapsamıyorsa, özel bir Shadow oluşturabilirsiniz. Bunun için @Implements(ClassName.class) notuyla bir sınıf oluşturun ve @Implementation ile gerekli yöntemleri uygulayın. Özel shadow'lar @Config(shadows = [CustomShadow::class]) aracılığıyla kaydedilir.
Robolectric, Robolectric.buildContentProvider() aracılığıyla ContentProvider testini destekler. CRUD işlemlerini, URI eşleştirmeli sorguları ve erişim izni yönetimini kontrol edebilirsiniz. Kaynaklar (dizeler, renkler, boyutlar) ayrıca RuntimeEnvironment.application.resources aracılığıyla da erişilebilir, bu da kaynaklara bağlı kodu test etmeyi sağlar.
Enstrümantasyon testlerinden Robolectric'e geçiş, yaklaşımda bir değişiklik gerektirir. Enstrümantasyon testleri (AndroidJUnit4) emülatörde gerçek davranışı kontrol ederken, Robolectric shadow ortamında izole mantığı kontrol eder. İş mantığının Robolectric testleriyle kapsanması ve enstrümantasyon testlerinin entegrasyon senaryoları için bırakılması önerilir.
Geçiş yaparken: AndroidJUnit4'ü RobolectricTestRunner ile değiştirin, hedef SDK sürümüyle @Config ekleyin, ActivityTestRule'u ActivityController ile değiştirin ve bağımlılıkları androidTestImplementation'dan testImplementation'a taşıyın. Mock'lar (MockK, Mockito) değişiklik olmadan Robolectric ile çalışır — platformdan bağımsızdırlar.
Robolectric şunları desteklemez: kamera (CameraX), NFC, Bluetooth, biyometri, gerçek dosyalarla ve yerel kitaplıklarla çalışma. Bu senaryolar emülatörde enstrümantasyon testleri gerektirir. Robolectric ayrıca gerçek oluşturmayı da yeniden üretmez — düzen testleri Compose Test Rule veya Espresso aracılığıyla daha iyi yapılır. Ancak, iş mantığı, navigasyon ve ViewModel durumlarını kontrol etmek için Robolectric, 10 kat daha hızlı yürütme ile emülatörün yerini tamamen alır.
Robolectric, JDK 11 veya üstünü gerektirir ve AGP (Android Gradle Plugin) 7.0'dan en son kararlı sürüme kadar uyumludur. Robolectric'in SDK Yöneticisi, ilk çalıştırmada gerekli Android API sürümlerini otomatik olarak indirir — bu tek seferlik bir işlemdir. CI sunucuları için, ilk test çalıştırmasındaki gecikmeleri önlemek üzere SDK'nın sdkmanager aracılığıyla önceden yüklenmesi önerilir. Robolectric'i yeni bir sürüme güncellemek genellikle test kodunda değişiklik gerektirmez, yalnızca build.gradle'daki bağımlılık numarasının güncellenmesi yeterlidir.
Robolectric, popüler mock'lama framework'leriyle uyumludur: Kotlin için MockK ve Java için Mockito. Mock'lar, bağımlılıkları (depolar, API istemcileri, SharedPreferences) izole etmek için kullanılır. Ana kural, Android SDK sınıflarını mock'lamamaktır — bunun için shadow nesneleri vardır. Yalnızca uygulama katmanlarını mock'layın: UseCase, Repository, DataSource ve diğer iş mantığı bileşenleri. Shadow nesneleri ve mock'ların bu kombinasyonu, minimum test yazma çabasıyla maksimum esneklik sağlar.
Sıkça Sorulan Sorular
Espresso, bir emülatör veya cihazda çalışan bir enstrümantasyon framework'üdür. Robolectric, JVM üzerinde çalışan bir birim test framework'üdür. Espresso gerçek davranışı test eder, Robolectric shadow ortamında izole mantığı test eder. Birbirlerini tamamlarlar.
Evet, Robolectric sürüm 4.8'den itibaren Jetpack Compose'u destekler. Compose bileşen testleri, emülatöre benzer şekilde ComposeTestRule ile yürütülür. Ancak, Robolectric'teki Compose testleri gerçek oluşturmayı kontrol etmez — yalnızca kompozisyon mantığını kontrol eder.
Robolectric çok modüllü projeleri destekler. Her modül, kendi manifest ve kaynaklarıyla ayrı ayrı yapılandırılır. Kullanıcı arayüzü bileşenleri olmayan modüller için Android eklentisi olmayan bir kitaplık modülü yeterlidir. Düzinelerce modülü olan büyük projelerde, her modülün Robolectric testleri paralel olarak çalışır ve emülatörde sıralı çalıştırmaya kıyasla ek hız avantajı sağlar.
Kaynak sorunu, build.gradle'da unitTests.includeAndroidResources = true ayarlanmamışsa veya manifeste doğru yola sahip @Config notu eksikse oluşur. Robolectric, build/intermediates'den derlenmiş kaynakları kullanır.
Robolectric testleri, Android Studio'da normal Java/Kotlin testleri gibi hata ayıklanır. Kesme noktaları, adım adım hata ayıklama ve shadow nesnelerinin ve durumlarının incelenmesi mevcuttur. Günlük kaydı, VM seçeneklerinde -Drobolectric.logging=debug ile etkinleştirilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun