Robolectric — यह क्या है, कार्य सिद्धांत और Android यूनिट टेस्टिंग

लेखक: IT Sectr प्रकाशित: 2026-04-09 पढ़ने का समय: 8 मिनट

Robolectric Android ऐप्लिकेशन की यूनिट टेस्टिंग के लिए एक फ्रेमवर्क है जो बिना एमुलेटर या भौतिक डिवाइस के सीधे JVM पर टेस्ट चलाने की अनुमति देता है। यह Android SDK कॉल को इंटरसेप्ट करता है और शैडो ऑब्जेक्ट प्रदान करता है जो वास्तविक घटकों के व्यवहार का अनुकरण करते हैं। Robolectric Documentation, 2025 के अनुसार, शैडो ऑब्जेक्ट लगभग 15 हज़ार Android API क्लासेज़ को बदल देते हैं, जो प्लेटफ़ॉर्म से टेस्ट को अलग करते हैं।

मुख्य बिंदु

  • Robolectric — बिना एमुलेटर के Android यूनिट टेस्टिंग के लिए फ्रेमवर्क, JVM पर चलता है
  • शैडो ऑब्जेक्ट Android SDK कॉल को इंटरसेप्ट करते हैं और सिस्टम व्यवहार का अनुकरण करते हैं
  • JUnit 4 और 5 के साथ एकीकरण मानक टेस्ट रनर का उपयोग करने देता है
  • टेस्ट सेकंड में चलते हैं, मिनटों में नहीं जैसे एमुलेटर में
  • समर्थन Jetpack Compose, फ़्रैगमेंट, इंटेंट, ContentProvider और रिसोर्सेज़ के लिए

Robolectric क्या है

Robolectric एक ओपन-सोर्स फ्रेमवर्क है जो 2010 में Android ऐप्लिकेशन टेस्टिंग को तेज़ करने के लिए बनाया गया था। एमुलेटर या डिवाइस पर चलने के बजाय, Robolectric Android SDK क्लासेज़ की शैडो इम्प्लीमेंटेशन प्रदान करता है जो सीधे जावा वर्चुअल मशीन (JVM) पर चलती हैं। यह सेकंडों में हज़ारों टेस्ट चलाने की अनुमति देता है।

Robolectric किस समस्या का समाधान करता है

पारंपरिक Android टेस्टिंग के लिए एमुलेटर पर ऐप्लिकेशन चलाना आवश्यक है, जिसमें APK बनाने, इंस्टॉल करने और चलाने में 3–10 मिनट लगते हैं। Robolectric इस चरण को समाप्त करता है: टेस्ट सामान्य Java/Kotlin टेस्ट की तरह कंपाइल होते हैं और JUnit के ज़रिए चलते हैं। यह मिनटों के बजाय सेकंड में फीडबैक लूप प्रदान करता है।

समर्थित Android वर्शन

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 क्लासेज़ के समान वंशानुक्रम पदानुक्रम का पालन करते हैं।

Robolectric स्थापित करना और कॉन्फ़िगर करना

Gradle प्रोजेक्ट में Robolectric स्थापित करने के लिए testImplementation "org.robolectric:robolectric:4.x" निर्भरता जोड़ना आवश्यक है। build.gradle फ़ाइल में androidsdk कॉन्फ़िगरेशन निर्दिष्ट करना और android:testInstrumentationRunner रिज़ॉल्यूशन जोड़ना भी आवश्यक है। Robolectric के साथ काम करने के लिए Android-टेस्ट प्लगइन की आवश्यकता नहीं है।

मूल Gradle कॉन्फ़िगरेशन

निर्भरता जोड़ने के बाद, मैनिफ़ेस्ट, रिसोर्सेज़ और एसेट्स के लिए निर्देशिका कॉन्फ़िगर करनी होगी। Robolectric स्वचालित रूप से AndroidManifest.xml ढूँढता है, लेकिन @Config एनोटेशन या सिस्टम प्रॉपर्टीज़ के ज़रिए पथ मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता हो सकती है। मल्टी-मॉड्यूल प्रोजेक्ट्स के लिए, कॉन्फ़िगरेशन प्रत्येक मॉड्यूल के लिए अलग से सेट किया जाता है।

groovy
// 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 एनोटेशन

@Config एनोटेशन टेस्ट पैरामीटर को ओवरराइड करने की अनुमति देता है: sdk (API वर्शन), manifest (मैनिफ़ेस्ट का पथ), qualifiers (स्क्रीन कॉन्फ़िगरेशन, भाषा)। यह विभिन्न Android वर्शन, स्क्रीन ओरिएंटेशन और लोकलाइज़ेशन पर ऐप्लिकेशन व्यवहार के परीक्षण के लिए उपयोगी है।

Robolectric के साथ टेस्ट लिखना

Robolectric टेस्ट JUnit 4 के लिए @RunWith(RobolectricTestRunner.class) या JUnit 5 के लिए RobolectricExtension के साथ सामान्य यूनिट टेस्ट के रूप में लिखे जाते हैं। ActivityController Activity जीवनचक्र प्रबंधित करता है: create(), start(), resume(), pause(), stop(), destroy()। यह प्रत्येक स्थिति संक्रमण का विस्तार से परीक्षण करने की अनुमति देता है।

Activity का परीक्षण

Activity के परीक्षण के लिए ActivityController का उपयोग किया जाता है, जो क्रमिक रूप से जीवनचक्र चरणों से गुज़रता है। Activity तक पहुँच controller.get() के माध्यम से होती है। सभी व्यू घटक findViewById के माध्यम से सुलभ हैं, जैसे वास्तविक ऐप्लिकेशन में। शैडो ऑब्जेक्ट टेक्स्ट, दृश्यता, रंग और अन्य व्यू विशेषताओं की जाँच करने की अनुमति देते हैं।

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

इंटेंट और नेविगेशन का परीक्षण

Robolectric startActivity() कॉल को इंटरसेप्ट करता है और ShadowActivity के माध्यम से भेजे गए इंटेंट की जाँच करने की अनुमति देता है। यह नेविगेशन का परीक्षण करना संभव बनाता है: सत्यापित करना कि बटन क्लिक करने पर सही Action, Data और Extra पैरामीटर वाला Intent भेजा जाता है।

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 बनाम एमुलेटर

Robolectric और एमुलेटर अलग-अलग कार्य हल करते हैं। Robolectric तेज़ यूनिट टेस्ट, UI लॉजिक, व्यवसाय घटकों और रिपॉज़िटरी की जाँच के लिए आदर्श है। एमुलेटर इंस्ट्रूमेंटेशन टेस्ट, API के साथ एकीकरण की जाँच, कैमरा, सेंसर और प्रदर्शन परीक्षण के लिए आवश्यक है।

विशेषताRobolectricएमुलेटर
गति~5 सेकंड प्रति 100 टेस्ट~5 मिनट प्रति 100 टेस्ट
चालनAPK बनाने की आवश्यकता नहींAPK बनाना आवश्यक
वास्तविक APIशैडो इम्यूलेशननेटिव Android SDK
तैयार-से-उपयोगकेवल JUnitकोई भी फ्रेमवर्क

ViewModel और Repository का परीक्षण

Robolectric ViewModel, Repository और UseCase — उन घटकों के परीक्षण के लिए उपयुक्त है जो Android SDK का उपयोग करते हैं लेकिन वास्तविक UI की आवश्यकता नहीं रखते। ViewModel का परीक्षण RobolectricExtension के साथ सामान्य JUnit टेस्ट के माध्यम से किया जाता है, जबकि जीवनचक्र घटक (LiveData, StateFlow) बिना मॉक के शैडो वातावरण में काम करते हैं।

LiveData का परीक्षण

Robolectric LiveData को तुरंत समर्थन करता है: आप टेस्ट में LiveData की सदस्यता ले सकते हैं, ViewModel के माध्यम से स्थिति बदल सकते हैं और उत्सर्जित मान की जाँच कर सकते हैं। एसिंक्रोनस ऑपरेशन के लिए InstantTaskExecutorRule या कोरूटीन के लिए runBlocking का उपयोग किया जाता है। यह आर्किटेक्चरल घटकों को मॉक करने की आवश्यकता को समाप्त करता है।

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

कस्टम शैडो ऑब्जेक्ट

यदि मानक Robolectric शैडो ऑब्जेक्ट किसी आवश्यक Android SDK क्लास को कवर नहीं करते हैं, तो आप कस्टम शैडो बना सकते हैं। इसके लिए @Implements(ClassName.class) एनोटेशन वाली क्लास बनाएँ और @Implementation के साथ आवश्यक विधियाँ लागू करें। कस्टम शैडो @Config(shadows = [CustomShadow::class]) के माध्यम से पंजीकृत किए जाते हैं।

ContentProvider और रिसोर्सेज़ का परीक्षण

Robolectric Robolectric.buildContentProvider() के माध्यम से ContentProvider परीक्षण का समर्थन करता है। आप CRUD ऑपरेशन, URI मैचिंग के साथ क्वेरी और पहुँच अधिकार प्रबंधन की जाँच कर सकते हैं। रिसोर्सेज़ (स्ट्रिंग, रंग, आयाम) RuntimeEnvironment.application.resources के माध्यम से भी सुलभ हैं, जो रिसोर्सेज़ पर निर्भर कोड का परीक्षण करने की अनुमति देता है।

एमुलेटर से Robolectric में स्थानांतरण

इंस्ट्रूमेंटेशन टेस्ट से 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 तेज़ निष्पादन के साथ एमुलेटर को पूरी तरह से बदल देता है।

Java और Kotlin वर्शन के साथ संगतता

Robolectric को JDK 11 या उच्चतर की आवश्यकता है और यह AGP (Android Gradle Plugin) 7.0 से नवीनतम स्थिर वर्शन तक संगत है। Robolectric का SDK प्रबंधक पहली बार चलाने पर आवश्यक Android API वर्शन स्वचालित रूप से डाउनलोड करता है — यह एक बार की प्रक्रिया है। CI सर्वर के लिए, पहले टेस्ट रन में देरी से बचने के लिए sdkmanager के माध्यम से SDK को पहले से लोड करने की अनुशंसा की जाती है। Robolectric को नए वर्शन में अपडेट करने के लिए आमतौर पर टेस्ट कोड में बदलाव की आवश्यकता नहीं होती, केवल build.gradle में निर्भरता संख्या अपडेट करनी होती है।

MockK और Mockito के साथ एकीकरण

Robolectric लोकप्रिय मॉकिंग फ्रेमवर्क के साथ संगत है: Kotlin के लिए MockK और Java के लिए Mockito। मॉक का उपयोग निर्भरताओं को पृथक करने के लिए किया जाता है: रिपॉज़िटरी, API क्लाइंट, SharedPreferences। मुख्य नियम है Android SDK क्लासेज़ को मॉक न करना — इसके लिए शैडो ऑब्जेक्ट मौजूद हैं। केवल ऐप्लिकेशन परतों को मॉक करें: UseCase, Repository, DataSource और अन्य व्यवसाय लॉजिक घटक। शैडो ऑब्जेक्ट और मॉक का यह संयोजन न्यूनतम टेस्ट लेखन प्रयास के साथ अधिकतम लचीलापन प्रदान करता है।

अक्सर पूछे जाने वाले प्रश्न

Robolectric, Espresso से कैसे भिन्न है?

Espresso एक इंस्ट्रूमेंटेशन फ्रेमवर्क है जो एमुलेटर या डिवाइस पर चलता है। Robolectric एक यूनिट टेस्टिंग फ्रेमवर्क है जो JVM पर चलता है। Espresso वास्तविक व्यवहार का परीक्षण करता है, Robolectric शैडो वातावरण में पृथक लॉजिक का। वे एक-दूसरे के पूरक हैं।

क्या Jetpack Compose को Robolectric से परखा जा सकता है?

हाँ, Robolectric वर्शन 4.8 से Jetpack Compose का समर्थन करता है। Compose घटकों के टेस्ट ComposeTestRule के साथ चलाए जाते हैं, एमुलेटर के समान। हालाँकि, Robolectric पर Compose टेस्ट वास्तविक रेंडरिंग की जाँच नहीं करते — केवल कंपोज़िशन लॉजिक की।

Robolectric Gradle मॉड्यूल के साथ कैसे काम करता है?

Robolectric मल्टी-मॉड्यूल प्रोजेक्ट का समर्थन करता है। प्रत्येक मॉड्यूल अपने स्वयं के मैनिफ़ेस्ट और रिसोर्सेज़ के साथ अलग से कॉन्फ़िगर किया जाता है। UI घटकों के बिना मॉड्यूल के लिए, Android प्लगइन के बिना लाइब्रेरी मॉड्यूल पर्याप्त है। दर्जनों मॉड्यूल वाले बड़े प्रोजेक्ट में, प्रत्येक मॉड्यूल के Robolectric टेस्ट समानांतर चलते हैं, जो एमुलेटर पर क्रमिक चलाने की तुलना में अतिरिक्त गति लाभ देता है।

Robolectric को रिसोर्सेज़ क्यों नहीं मिल पाते?

रिसोर्सेज़ की समस्या तब होती है जब build.gradle में unitTests.includeAndroidResources = true न हो या मैनिफ़ेस्ट के सही पथ के साथ @Config एनोटेशन गायब हो। Robolectric build/intermediates से संकलित रिसोर्सेज़ का उपयोग करता है।

Robolectric टेस्ट को डीबग कैसे करें?

Robolectric टेस्ट Android Studio में सामान्य Java/Kotlin टेस्ट की तरह डीबग किए जाते हैं। ब्रेकपॉइंट, स्टेप-थ्रू डीबगिंग, शैडो ऑब्जेक्ट और उनकी स्थिति का निरीक्षण उपलब्ध है। लॉगिंग VM विकल्पों में -Drobolectric.logging=debug के माध्यम से सक्षम की जाती है।

सारांश

  • Robolectric — बिना एमुलेटर के JVM पर तेज़ Android यूनिट टेस्टिंग के लिए फ्रेमवर्क
  • शैडो ऑब्जेक्ट 200 से अधिक Android SDK क्लासेज़ को बदलते हैं, उनके व्यवहार का अनुकरण करते हुए
  • Activity और Fragment का जीवनचक्र ActivityController के माध्यम से स्थिति सत्यापन के साथ प्रबंधित होता है
  • इंटेंट परीक्षण ShadowActivity के माध्यम से नेविगेशन और डेटा स्थानांतरण की जाँच करने देता है
  • JUnit और Gradle के साथ एकीकरण के लिए अतिरिक्त इंस्ट्रूमेंटेशन रनर की आवश्यकता नहीं
  • @Config एनोटेशन API वर्शन, भाषा, स्क्रीन कॉन्फ़िगरेशन और रिसोर्सेज़ निर्दिष्ट करता है
  • Robolectric और Espresso एक-दूसरे के पूरक: तेज़ यूनिट टेस्ट बनाम इंस्ट्रूमेंटेशन

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें