Robolectric Android ऐप्लिकेशन की यूनिट टेस्टिंग के लिए एक फ्रेमवर्क है जो बिना एमुलेटर या भौतिक डिवाइस के सीधे JVM पर टेस्ट चलाने की अनुमति देता है। यह Android SDK कॉल को इंटरसेप्ट करता है और शैडो ऑब्जेक्ट प्रदान करता है जो वास्तविक घटकों के व्यवहार का अनुकरण करते हैं। Robolectric Documentation, 2025 के अनुसार, शैडो ऑब्जेक्ट लगभग 15 हज़ार Android API क्लासेज़ को बदल देते हैं, जो प्लेटफ़ॉर्म से टेस्ट को अलग करते हैं।
मुख्य बिंदु
Robolectric एक ओपन-सोर्स फ्रेमवर्क है जो 2010 में Android ऐप्लिकेशन टेस्टिंग को तेज़ करने के लिए बनाया गया था। एमुलेटर या डिवाइस पर चलने के बजाय, Robolectric Android SDK क्लासेज़ की शैडो इम्प्लीमेंटेशन प्रदान करता है जो सीधे जावा वर्चुअल मशीन (JVM) पर चलती हैं। यह सेकंडों में हज़ारों टेस्ट चलाने की अनुमति देता है।
पारंपरिक Android टेस्टिंग के लिए एमुलेटर पर ऐप्लिकेशन चलाना आवश्यक है, जिसमें APK बनाने, इंस्टॉल करने और चलाने में 3–10 मिनट लगते हैं। Robolectric इस चरण को समाप्त करता है: टेस्ट सामान्य Java/Kotlin टेस्ट की तरह कंपाइल होते हैं और JUnit के ज़रिए चलते हैं। यह मिनटों के बजाय सेकंड में फीडबैक लूप प्रदान करता है।
Robolectric API 16 (Android 4.1) से लेकर नवीनतम स्थिर रिलीज़ तक सभी Android वर्शन को समर्थन करता है। प्रत्येक वर्शन के लिए शैडो ऑब्जेक्ट का संबंधित सेट प्रदान किया जाता है जो उस प्लेटफ़ॉर्म वर्शन के व्यवहार का अनुकरण करता है जिस पर ऐप्लिकेशन का परीक्षण किया जा रहा है।
Robolectric आर्किटेक्चर क्लासलोडर प्रतिस्थापन के माध्यम से कॉल इंटरसेप्ट करने के तंत्र पर आधारित है। जब कोई टेस्ट Android SDK विधि को कॉल करता है, Robolectric कॉल को इंटरसेप्ट करता है और इसे शैडो ऑब्जेक्ट पर भेजता है। शैडो ऑब्जेक्ट एक Java क्लास है जो Android घटक के वास्तविक व्यवहार की नकल करता है लेकिन बिना नेटिव प्लेटफ़ॉर्म के काम करता है।
शैडो ऑब्जेक्ट मूल Android क्लासेज़ की मुख्य विधियों को लागू करते हैं। उदाहरण के लिए, ShadowTextView getText(), setText(), getCurrentTextColor() और अन्य विधियों की नकल करता है। जब textView.setText("नमस्ते") कॉल किया जाता है, शैडो स्ट्रिंग को सहेजता है और getText() कॉल करने पर उसे वापस करता है। यह टेस्ट को वास्तविक रेंडरिंग और सिस्टम सेवाओं से अलग करता है।
Robolectric 200 से अधिक शैडो क्लासेज़ का समर्थन करता है जो Android SDK के मुख्य घटकों को कवर करती हैं: Activity, Fragment, TextView, Button, RecyclerView, WebView, LocationManager, ConnectivityManager और कई अन्य। शैडो ऑब्जेक्ट मूल Android क्लासेज़ के समान वंशानुक्रम पदानुक्रम का पालन करते हैं।
Gradle प्रोजेक्ट में Robolectric स्थापित करने के लिए testImplementation "org.robolectric:robolectric:4.x" निर्भरता जोड़ना आवश्यक है। build.gradle फ़ाइल में androidsdk कॉन्फ़िगरेशन निर्दिष्ट करना और android:testInstrumentationRunner रिज़ॉल्यूशन जोड़ना भी आवश्यक है। Robolectric के साथ काम करने के लिए Android-टेस्ट प्लगइन की आवश्यकता नहीं है।
निर्भरता जोड़ने के बाद, मैनिफ़ेस्ट, रिसोर्सेज़ और एसेट्स के लिए निर्देशिका कॉन्फ़िगर करनी होगी। Robolectric स्वचालित रूप से AndroidManifest.xml ढूँढता है, लेकिन @Config एनोटेशन या सिस्टम प्रॉपर्टीज़ के ज़रिए पथ मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता हो सकती है। मल्टी-मॉड्यूल प्रोजेक्ट्स के लिए, कॉन्फ़िगरेशन प्रत्येक मॉड्यूल के लिए अलग से सेट किया जाता है।
// build.gradle — 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 एनोटेशन टेस्ट पैरामीटर को ओवरराइड करने की अनुमति देता है: sdk (API वर्शन), manifest (मैनिफ़ेस्ट का पथ), qualifiers (स्क्रीन कॉन्फ़िगरेशन, भाषा)। यह विभिन्न Android वर्शन, स्क्रीन ओरिएंटेशन और लोकलाइज़ेशन पर ऐप्लिकेशन व्यवहार के परीक्षण के लिए उपयोगी है।
Robolectric टेस्ट JUnit 4 के लिए @RunWith(RobolectricTestRunner.class) या JUnit 5 के लिए RobolectricExtension के साथ सामान्य यूनिट टेस्ट के रूप में लिखे जाते हैं। ActivityController Activity जीवनचक्र प्रबंधित करता है: create(), start(), resume(), pause(), stop(), destroy()। यह प्रत्येक स्थिति संक्रमण का विस्तार से परीक्षण करने की अनुमति देता है।
Activity के परीक्षण के लिए ActivityController का उपयोग किया जाता है, जो क्रमिक रूप से जीवनचक्र चरणों से गुज़रता है। Activity तक पहुँच controller.get() के माध्यम से होती है। सभी व्यू घटक findViewById के माध्यम से सुलभ हैं, जैसे वास्तविक ऐप्लिकेशन में। शैडो ऑब्जेक्ट टेक्स्ट, दृश्यता, रंग और अन्य व्यू विशेषताओं की जाँच करने की अनुमति देते हैं।
@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() कॉल को इंटरसेप्ट करता है और ShadowActivity के माध्यम से भेजे गए इंटेंट की जाँच करने की अनुमति देता है। यह नेविगेशन का परीक्षण करना संभव बनाता है: सत्यापित करना कि बटन क्लिक करने पर सही Action, Data और Extra पैरामीटर वाला Intent भेजा जाता है।
@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 और एमुलेटर अलग-अलग कार्य हल करते हैं। Robolectric तेज़ यूनिट टेस्ट, UI लॉजिक, व्यवसाय घटकों और रिपॉज़िटरी की जाँच के लिए आदर्श है। एमुलेटर इंस्ट्रूमेंटेशन टेस्ट, API के साथ एकीकरण की जाँच, कैमरा, सेंसर और प्रदर्शन परीक्षण के लिए आवश्यक है।
| विशेषता | Robolectric | एमुलेटर |
|---|---|---|
| गति | ~5 सेकंड प्रति 100 टेस्ट | ~5 मिनट प्रति 100 टेस्ट |
| चालन | APK बनाने की आवश्यकता नहीं | APK बनाना आवश्यक |
| वास्तविक API | शैडो इम्यूलेशन | नेटिव Android SDK |
| तैयार-से-उपयोग | केवल JUnit | कोई भी फ्रेमवर्क |
Robolectric ViewModel, Repository और UseCase — उन घटकों के परीक्षण के लिए उपयुक्त है जो Android SDK का उपयोग करते हैं लेकिन वास्तविक UI की आवश्यकता नहीं रखते। ViewModel का परीक्षण RobolectricExtension के साथ सामान्य JUnit टेस्ट के माध्यम से किया जाता है, जबकि जीवनचक्र घटक (LiveData, StateFlow) बिना मॉक के शैडो वातावरण में काम करते हैं।
Robolectric LiveData को तुरंत समर्थन करता है: आप टेस्ट में LiveData की सदस्यता ले सकते हैं, ViewModel के माध्यम से स्थिति बदल सकते हैं और उत्सर्जित मान की जाँच कर सकते हैं। एसिंक्रोनस ऑपरेशन के लिए InstantTaskExecutorRule या कोरूटीन के लिए runBlocking का उपयोग किया जाता है। यह आर्किटेक्चरल घटकों को मॉक करने की आवश्यकता को समाप्त करता है।
@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)
}
}
यदि मानक Robolectric शैडो ऑब्जेक्ट किसी आवश्यक Android SDK क्लास को कवर नहीं करते हैं, तो आप कस्टम शैडो बना सकते हैं। इसके लिए @Implements(ClassName.class) एनोटेशन वाली क्लास बनाएँ और @Implementation के साथ आवश्यक विधियाँ लागू करें। कस्टम शैडो @Config(shadows = [CustomShadow::class]) के माध्यम से पंजीकृत किए जाते हैं।
Robolectric Robolectric.buildContentProvider() के माध्यम से ContentProvider परीक्षण का समर्थन करता है। आप CRUD ऑपरेशन, URI मैचिंग के साथ क्वेरी और पहुँच अधिकार प्रबंधन की जाँच कर सकते हैं। रिसोर्सेज़ (स्ट्रिंग, रंग, आयाम) RuntimeEnvironment.application.resources के माध्यम से भी सुलभ हैं, जो रिसोर्सेज़ पर निर्भर कोड का परीक्षण करने की अनुमति देता है।
इंस्ट्रूमेंटेशन टेस्ट से Robolectric में संक्रमण के लिए दृष्टिकोण में बदलाव आवश्यक है। इंस्ट्रूमेंटेशन टेस्ट (AndroidJUnit4) एमुलेटर पर वास्तविक व्यवहार की जाँच करते हैं, जबकि Robolectric शैडो वातावरण में पृथक लॉजिक की जाँच करता है। व्यवसाय लॉजिक को Robolectric टेस्ट से कवर करने और इंस्ट्रूमेंटेशन टेस्ट को एकीकरण परिदृश्यों के लिए छोड़ने की अनुशंसा की जाती है।
स्थानांतरण करते समय: AndroidJUnit4 को RobolectricTestRunner से बदलें, लक्षित SDK वर्शन के साथ @Config जोड़ें, ActivityTestRule को ActivityController से बदलें, और निर्भरताएँ androidTestImplementation से testImplementation में ले जाएँ। मॉक (MockK, Mockito) बिना बदलाव के Robolectric के साथ काम करते हैं — वे प्लेटफ़ॉर्म-स्वतंत्र हैं।
Robolectric समर्थन नहीं करता: कैमरा (CameraX), NFC, Bluetooth, बायोमेट्रिक्स, वास्तविक फ़ाइलों और नेटिव लाइब्रेरीज़ के साथ काम करना। इन परिदृश्यों के लिए एमुलेटर पर इंस्ट्रूमेंटेशन टेस्ट आवश्यक हैं। Robolectric वास्तविक रेंडरिंग भी पुनरुत्पादित नहीं करता — लेआउट परीक्षण Compose Test Rule या Espresso के माध्यम से बेहतर किया जाता है। हालाँकि, व्यवसाय लॉजिक, नेविगेशन और ViewModel स्थितियों की जाँच के लिए, Robolectric 10x तेज़ निष्पादन के साथ एमुलेटर को पूरी तरह से बदल देता है।
Robolectric को JDK 11 या उच्चतर की आवश्यकता है और यह AGP (Android Gradle Plugin) 7.0 से नवीनतम स्थिर वर्शन तक संगत है। Robolectric का SDK प्रबंधक पहली बार चलाने पर आवश्यक Android API वर्शन स्वचालित रूप से डाउनलोड करता है — यह एक बार की प्रक्रिया है। CI सर्वर के लिए, पहले टेस्ट रन में देरी से बचने के लिए sdkmanager के माध्यम से SDK को पहले से लोड करने की अनुशंसा की जाती है। Robolectric को नए वर्शन में अपडेट करने के लिए आमतौर पर टेस्ट कोड में बदलाव की आवश्यकता नहीं होती, केवल build.gradle में निर्भरता संख्या अपडेट करनी होती है।
Robolectric लोकप्रिय मॉकिंग फ्रेमवर्क के साथ संगत है: Kotlin के लिए MockK और Java के लिए Mockito। मॉक का उपयोग निर्भरताओं को पृथक करने के लिए किया जाता है: रिपॉज़िटरी, API क्लाइंट, SharedPreferences। मुख्य नियम है Android SDK क्लासेज़ को मॉक न करना — इसके लिए शैडो ऑब्जेक्ट मौजूद हैं। केवल ऐप्लिकेशन परतों को मॉक करें: UseCase, Repository, DataSource और अन्य व्यवसाय लॉजिक घटक। शैडो ऑब्जेक्ट और मॉक का यह संयोजन न्यूनतम टेस्ट लेखन प्रयास के साथ अधिकतम लचीलापन प्रदान करता है।
अक्सर पूछे जाने वाले प्रश्न
Espresso एक इंस्ट्रूमेंटेशन फ्रेमवर्क है जो एमुलेटर या डिवाइस पर चलता है। Robolectric एक यूनिट टेस्टिंग फ्रेमवर्क है जो JVM पर चलता है। Espresso वास्तविक व्यवहार का परीक्षण करता है, Robolectric शैडो वातावरण में पृथक लॉजिक का। वे एक-दूसरे के पूरक हैं।
हाँ, Robolectric वर्शन 4.8 से Jetpack Compose का समर्थन करता है। Compose घटकों के टेस्ट ComposeTestRule के साथ चलाए जाते हैं, एमुलेटर के समान। हालाँकि, Robolectric पर Compose टेस्ट वास्तविक रेंडरिंग की जाँच नहीं करते — केवल कंपोज़िशन लॉजिक की।
Robolectric मल्टी-मॉड्यूल प्रोजेक्ट का समर्थन करता है। प्रत्येक मॉड्यूल अपने स्वयं के मैनिफ़ेस्ट और रिसोर्सेज़ के साथ अलग से कॉन्फ़िगर किया जाता है। UI घटकों के बिना मॉड्यूल के लिए, Android प्लगइन के बिना लाइब्रेरी मॉड्यूल पर्याप्त है। दर्जनों मॉड्यूल वाले बड़े प्रोजेक्ट में, प्रत्येक मॉड्यूल के Robolectric टेस्ट समानांतर चलते हैं, जो एमुलेटर पर क्रमिक चलाने की तुलना में अतिरिक्त गति लाभ देता है।
रिसोर्सेज़ की समस्या तब होती है जब build.gradle में unitTests.includeAndroidResources = true न हो या मैनिफ़ेस्ट के सही पथ के साथ @Config एनोटेशन गायब हो। Robolectric build/intermediates से संकलित रिसोर्सेज़ का उपयोग करता है।
Robolectric टेस्ट Android Studio में सामान्य Java/Kotlin टेस्ट की तरह डीबग किए जाते हैं। ब्रेकपॉइंट, स्टेप-थ्रू डीबगिंग, शैडो ऑब्जेक्ट और उनकी स्थिति का निरीक्षण उपलब्ध है। लॉगिंग VM विकल्पों में -Drobolectric.logging=debug के माध्यम से सक्षम की जाती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें