वास्तव में, मुझे एपीआई कॉल की प्रतिक्रिया प्राप्त करने की आवश्यकता है, इसके लिए मुझे आवश्यक है Context
।
वास्तव में, मुझे एपीआई कॉल की प्रतिक्रिया प्राप्त करने की आवश्यकता है, इसके लिए मुझे आवश्यक है Context
।
जवाबों:
अपडेट करें।
संस्करण 1.x और 2.x के लिए उपयोग करें:
Robolectric.application;
और संस्करण 3.x के लिए:
RuntimeEnvironment.application;
और संस्करण 4.x के लिए:
अपनी build.gradle
फ़ाइल में जोड़ें :
testImplementation 'androidx.test:core:1.0.0'
इसके साथ संदर्भ प्राप्त करें:
ApplicationProvider.getApplicationContext()
RuntimeEnvironment.application
स्थिर कोड (जैसे तरीकों के साथ एनोटेट @BeforeClass
) का उपयोग नहीं करते हैं क्योंकि रोबोइलेक्ट्रिक शायद उस बिंदु पर आरंभिक नहीं होगा और मूल्य होगा null
।
जोड़ना
testImplementation "androidx.test:core-ktx:${deps.testrunner}"
और उपयोग करें:
private val app = ApplicationProvider.getApplicationContext()
2019 में अभी के रूप में नवीनतम रोबोइलेक्ट्रिक 4.3 के लिए `
ShadowApplication.getInstance ()
`और
Roboletric.application
दोनों वंचित हैं। इसलिए मैं उपयोग कर रहा हूं
Context context = RuntimeEnvironment.systemContext;
प्रसंग पाने के लिए।
आवेदन संदर्भ प्राप्त करने के लिए आपको निम्नलिखित कार्य करने होंगे:
यह मेरे लिए Robolectric 3.5.1 के साथ काम करता है: ShadowApplication.getInstance().applicationContext
RuntimeEnvironment.application
या RuntimeEnvironment.application.getApplicationContext()
यदि आपके लिए काम करना बेहतर है ।
21 जुलाई को 4.0-अल्फा -3 जारी करने के बाद , उन्होंने हटा दिया ShadowApplication.getApplicationContext()
। के साथ RuntimeEnvironment.application.getApplicationContext()
एनोटेट किसी भी परीक्षण के लिए छड़ी @RunWith(RobolectricTestRunner::class)
।
एक तरफ के रूप में, उनके वर्तमान गाइड में स्ट्रिंग संसाधनों का उपयोग करने का एक उदाहरण है:
final Context context = RuntimeEnvironment.application;
(नोट के लिए javadocs कि RuntimeEnvironment
और ShadowApplication
वर्तमान में गैर-अल्फा 3.x रिहाई को दर्शाते हैं।)
कुछ मामलों में, आपको 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 $
यह सीधे उपयोग Robolectric.getShadowApplication()
करने के बजाय उपयोग करने के लिए सुरक्षित है Robolectric.application
।
Robolectric.application
@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'
}
आपके मामले में मुझे लगता है कि आपको इस बात से सावधान रहना चाहिए कि आप वास्तव में क्या परीक्षण कर रहे हैं। कभी-कभी अप्राप्य कोड के मुद्दों में या असंभव कोड के रूप में चलना एक संकेत है कि शायद आपके कोड को फिर से सक्रिय करने की आवश्यकता है।
एपीआई कॉल प्रतिक्रिया के लिए आप एपीआई कॉल का परीक्षण नहीं करना चाहते हैं। यह परीक्षण करने के लिए आवश्यक नहीं हो सकता है कि किसी भी मनमानी वेब सेवा से जानकारी भेजना / प्राप्त करना संभव है, बल्कि यह कि आपका कोड अपेक्षित मनोर में आपकी प्रतिक्रिया को संभालता है और संसाधित करता है।
जिस स्थिति में आप जिस कोड का परीक्षण करना चाहते हैं, उसे फिर से सक्रिय करना बेहतर हो सकता है। किसी अन्य वर्ग के लिए प्रतिक्रिया पार्सिंग / हैंडलिंग को तोड़ दें जो एक सरल स्वीकार करता है String
और नमूना स्ट्रिंग प्रतिक्रियाओं को इंजेक्ट करके उस वर्ग पर अपना परीक्षण करता है ।
यह सिंगल रिस्पॉन्सिबिलिटी और डिपेंडेंसी इनवर्जन ( एस) के विचारों के बाद कम या ज्यादा है एंड डी में ठोस )
ठीक है, इसलिए मुझे पता है कि कई अन्य लोगों ने कहा कि यह उत्तर पहले और पुराना हो सकता है
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