हम रोबोइलेक्ट्रिक में किसी एप्लिकेशन के संदर्भ तक कैसे पहुंच सकते हैं?


112

वास्तव में, मुझे एपीआई कॉल की प्रतिक्रिया प्राप्त करने की आवश्यकता है, इसके लिए मुझे आवश्यक है Context

जवाबों:


218

अपडेट करें।

संस्करण 1.x और 2.x के लिए उपयोग करें:

Robolectric.application;

और संस्करण 3.x के लिए:

RuntimeEnvironment.application;

और संस्करण 4.x के लिए:

  • अपनी build.gradleफ़ाइल में जोड़ें :

    testImplementation 'androidx.test:core:1.0.0'
    
  • इसके साथ संदर्भ प्राप्त करें:

    ApplicationProvider.getApplicationContext()
    

11
क्या आपने अपने परीक्षणों के लिए @RunWith (RobolectricTestRunner.class) डाला?
यूजीन मार्टीनोव

4
हाँ .. मैंने जोड़ा ... लेकिन फिर भी यह अशक्त है
user1667968

1
मैंने वह सब किया है जो आपने उल्लेख किया है और अभी भी अशक्त है। मुझे और कुछ याद आ रही है?
मोइज्स जिमेनेज़

13
यह भी सुनिश्चित करें कि आप RuntimeEnvironment.applicationस्थिर कोड (जैसे तरीकों के साथ एनोटेट @BeforeClass) का उपयोग नहीं करते हैं क्योंकि रोबोइलेक्ट्रिक शायद उस बिंदु पर आरंभिक नहीं होगा और मूल्य होगा null
sfera

1
इसके अलावा यह परीक्षण के बीच खून बहाने का कारण बनता है .. जो वांछनीय नहीं हो सकता है
क्रिस

26

आप उपयोग कर सकते हैं

RuntimeEnvironment.application

4
RoboElectric 3.0 में, Roboelectric.application अब मौजूद नहीं है, इसलिए यह संभवतः सबसे अच्छा उत्तर है
kenyee


16

जोड़ना

testImplementation "androidx.test:core-ktx:${deps.testrunner}"

और उपयोग करें:

private val app = ApplicationProvider.getApplicationContext()

import androidx.test.core.app.ApplicationProvider
लकीचंदलर

Val appContext = ApplicationProvider.getApplicationContext <Context> ()
भाग्यशाली खंड

2
यह नवीनतम रोबोइलेक्ट्रिक के साथ सही उत्तर है। यहाँ उल्लिखित अन्य विधियों को पदावनत या हटाया जाता है।
गबोर

7

2019 में अभी के रूप में नवीनतम रोबोइलेक्ट्रिक 4.3 के लिए `

ShadowApplication.getInstance ()

`और

Roboletric.application

दोनों वंचित हैं। इसलिए मैं उपयोग कर रहा हूं

Context context = RuntimeEnvironment.systemContext;

प्रसंग पाने के लिए।


5

आवेदन संदर्भ प्राप्त करने के लिए आपको निम्नलिखित कार्य करने होंगे:

  1. एनोटेट @RunWith (RobolectricTestRunner.class)
  2. RuntimeEnvironment.application.getApplicationContext ()

2

यह मेरे लिए Robolectric 3.5.1 के साथ काम करता है: ShadowApplication.getInstance().applicationContext


ध्यान दें कि ऐसा लगता है कि 4.0 रिलीज़ इस विधि को हटा देगा; के साथ रहना RuntimeEnvironment.applicationया RuntimeEnvironment.application.getApplicationContext()यदि आपके लिए काम करना बेहतर है ।
qix

2

21 जुलाई को 4.0-अल्फा -3 जारी करने के बाद , उन्होंने हटा दिया ShadowApplication.getApplicationContext() । के साथ RuntimeEnvironment.application.getApplicationContext()एनोटेट किसी भी परीक्षण के लिए छड़ी @RunWith(RobolectricTestRunner::class)

एक तरफ के रूप में, उनके वर्तमान गाइड में स्ट्रिंग संसाधनों का उपयोग करने का एक उदाहरण है:

final Context context = RuntimeEnvironment.application;

(नोट के लिए javadocs कि RuntimeEnvironmentऔर ShadowApplicationवर्तमान में गैर-अल्फा 3.x रिहाई को दर्शाते हैं।)


2

सबसे पहले निम्नलिखित को अपने साथ जोड़ें build.gradle:

testImplementation 'androidx.test:core:1.2.0'

फिर उपयोग करें:

ApplicationProvider.getApplicationContext() as Application


2

कुछ मामलों में, आपको Robolectris डिफ़ॉल्ट संदर्भ के बजाय अपने ऐप के संदर्भ की आवश्यकता हो सकती है। उदाहरण के लिए, यदि आप अपना पैकेज नाम प्राप्त करना चाहते हैं। डिफ़ॉल्ट रूप से रोबोइलेक्ट्रिक आपको org.robolectric.defaultपैकेज नाम वापस कर देगा । अपना असली पैकेज नाम प्राप्त करने के लिए निम्न कार्य करें:

build.gradle

testImplementation 'org.robolectric:robolectric:4.2.1'

आपका परीक्षण वर्ग:

@RunWith(RobolectricTestRunner.class)
@Config( manifest="AndroidManifest.xml")
public class FooTest {

@Test
public void fooTestWithPackageName(){
    Context context = ApplicationProvider.getApplicationContext();
    System.out.println("My Real Package Name: " + context.getPackageName());
}

}

सुनिश्चित करें कि आपके रन / डिबग कॉन्फ़िगरेशन में कार्य निर्देशिका के लिए सेट है: $ MODULE_DIR $ यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें


1

यह सीधे उपयोग Robolectric.getShadowApplication()करने के बजाय उपयोग करने के लिए सुरक्षित है Robolectric.application


लेकिन क्या होगा अगर मुझे अपने कस्टम एप्लिकेशन के कुछ कस्टम गुणों तक पहुंचने की आवश्यकता है? ऐसा लगता है कि मैं छाया वस्तु से वास्तविक वस्तु प्राप्त नहीं कर सकता।
डेनिस नियाज़ेव

@DenisKniazhev क्षमा करें, मैं आपके लिए इसका जवाब नहीं दे सकता। कुछ समय बाद जब हमने रोबोइलेक्ट्रिक का उपयोग करना शुरू किया तो हमने ट्रैविस को अपने सीआई के रूप में उपयोग करना शुरू कर दिया, और वे अच्छी तरह से नहीं खेलते हैं। मेरा अनुमान है कि आप इसे या तो अपने आवेदन में डाल सकते हैं या आपको उस तक पहुंचने के लिए कस्टम धावक बनाने की आवश्यकता हो सकती है। बेस्ट ऑफ़ लक
drspaceboo

धन्यवाद, अभी के लिए मैं बस अटक गया हैRobolectric.application
डेनिस नियाज़ेव

6
Robolectric.getShadowApplication () उपलब्ध नहीं है
IgGanapolsky

1

@EugenMartynov और @rds के जवाबों से सहमत ...।

एक त्वरित उदाहरण वॉली-मार्शमैलो-रिलीज़ पर पाया जा सकता है

NetworkImageViewTest.java में

// mNIV = new NetworkImageView(Robolectric.application); mNIV = new NetworkImageView(RuntimeEnvironment.application);

वॉली लिंक उपलब्ध है https://android.googlesource.com/platform/frameworks/volley/+/marshmallow-release

आपको एंड्रॉइड स्टूडियो में वॉली मॉड्यूल में निर्भरता को जोड़ना होगा:

dependencies { testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'org.robolectric:robolectric:3.1.2' }


1

आपके मामले में मुझे लगता है कि आपको इस बात से सावधान रहना चाहिए कि आप वास्तव में क्या परीक्षण कर रहे हैं। कभी-कभी अप्राप्य कोड के मुद्दों में या असंभव कोड के रूप में चलना एक संकेत है कि शायद आपके कोड को फिर से सक्रिय करने की आवश्यकता है।

एपीआई कॉल प्रतिक्रिया के लिए आप एपीआई कॉल का परीक्षण नहीं करना चाहते हैं। यह परीक्षण करने के लिए आवश्यक नहीं हो सकता है कि किसी भी मनमानी वेब सेवा से जानकारी भेजना / प्राप्त करना संभव है, बल्कि यह कि आपका कोड अपेक्षित मनोर में आपकी प्रतिक्रिया को संभालता है और संसाधित करता है।

जिस स्थिति में आप जिस कोड का परीक्षण करना चाहते हैं, उसे फिर से सक्रिय करना बेहतर हो सकता है। किसी अन्य वर्ग के लिए प्रतिक्रिया पार्सिंग / हैंडलिंग को तोड़ दें जो एक सरल स्वीकार करता है Stringऔर नमूना स्ट्रिंग प्रतिक्रियाओं को इंजेक्ट करके उस वर्ग पर अपना परीक्षण करता है

यह सिंगल रिस्पॉन्सिबिलिटी और डिपेंडेंसी इनवर्जन ( एस) के विचारों के बाद कम या ज्यादा है एंड डी में ठोस )


1

ठीक है, इसलिए मुझे पता है कि कई अन्य लोगों ने कहा कि यह उत्तर पहले और पुराना हो सकता है

    when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
    when(mockApplication.getFilesDir()).thenReturn(RuntimeEnvironment.application.getFilesDir());

    sharedPref = RuntimeEnvironment.application.getSharedPreferences(KEY_MY_PREF, Context.MODE_PRIVATE);
    sut = new BundleManagerImpl(mockApplication,
            processHtmlBundle, resultListener, sharedPref);

मैं अशक्त हो गया, क्योंकि जब () भाग sut आरंभीकरण के बाद था। यह आपकी कुछ मदद कर सकता है।

मेरे पास भी है

@RunWith(CustomRobolectricTestRunner.class)
@Config(constants = BuildConfig.class)

कक्षा की शुरुआत में

भी

 when(mockApplication.getApplicationContext()).thenReturn(RuntimeEnvironment.application.getApplicationContext()); works
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.