एंड्रॉइड जूनिट परीक्षण मामले में परीक्षण परियोजना का संदर्भ प्राप्त करें


108

क्या किसी को पता है कि आप एंड्रॉइड जूनिट टेस्ट केस (AndroidTestCase का विस्तार) में टेस्ट प्रोजेक्ट का संदर्भ कैसे प्राप्त कर सकते हैं ।

नोट: परीक्षण इंस्ट्रूमेंटेशन टेस्ट नहीं है।

नोट 2: मुझे परीक्षण प्रोजेक्ट के संदर्भ की आवश्यकता है, न कि उस वास्तविक एप्लिकेशन के संदर्भ की जो परीक्षण किया गया है।

मुझे परीक्षण परियोजना से संपत्ति से कुछ फाइलें लोड करने के लिए इसकी आवश्यकता है।


आप सिर्फ इंस्ट्रूमेंटेशन टेस्ट का उपयोग क्यों नहीं कर सकते?
yorkw

1
क्योंकि मैं यूआई नहीं बल्कि सेवाओं का परीक्षण कर रहा हूं।
peceps

1
यहाँ एक बेहतर उत्तर मिला है: [JUnit परीक्षण के बजाय AndroidTestCase का उपयोग करना] [1] [१]: stackoverflow.com/questions/3170706/…
Jaime Botero

जवाबों:


136

एंड्रॉइड टेस्टिंग सपोर्ट लाइब्रेरी (वर्तमान में androidx.test:runner:1.1.1) के साथ नया दृष्टिकोण है । कोटलिन अद्यतन उदाहरण:

class ExampleInstrumentedTest {

    lateinit var instrumentationContext: Context

    @Before
    fun setup() {
        instrumentationContext = InstrumentationRegistry.getInstrumentation().context
    }

    @Test
    fun someTest() {
        TODO()
    }
}

यदि आप भी एप्लिकेशन संदर्भ रन चाहते हैं:

InstrumentationRegistry.getInstrumentation().targetContext

पूर्ण चल उदाहरण: https://github.com/fada21/AndroidTestContextExample

यहाँ देखें: getTargetContext () और getContext (इंस्ट्रूमेंटेशन रेजिस्ट्री पर) के बीच क्या अंतर है?


अंत में इंस्ट्रूमेंटेशन टेस्ट के साथ JUnit4 का उपयोग करने के तरीके पर एक उत्तर। घंटों खोज के बाद। होगा Android विकास प्यार करता हूँ।
फेबियान ज़ींडल

1
अच्छा! tx (ध्यान दें कि आपके कक्षा सदस्य में एक टाइपो है)
ग्रेग

1
क्या कोई इस बात में मदद कर सकता है कि इस काम के लिए ग्रेडेल फ़ाइल में क्या निर्भरताएँ जोड़ी जानी चाहिए?
ग्रेग

1
compile "com.android.support.test:runner:1.0.1"
ग्रेड

2
यह पदावनत है, InstrumentationRegistry.getInstrumentation().contextइसके बजाय उपयोग करें ।
एलन वेलोसो

37

कुछ शोध के बाद एकमात्र काम करने वाला समाधान लगता है कि पहले से ही बताया गया एक यॉर्कर है। आपको इंस्ट्रूमेंटेशनटेस्टकेस का विस्तार करना होगा और फिर आप getInstrumentation ()। GetContext () का उपयोग करके अपने टेस्ट एप्लिकेशन के संदर्भ तक पहुंच सकते हैं - यहां उपरोक्त सुझावों का उपयोग करके एक संक्षिप्त कोड स्निपेट दिया गया है:

public class PrintoutPullParserTest extends InstrumentationTestCase {

    public void testParsing() throws Exception {
        PrintoutPullParser parser = new PrintoutPullParser();
        parser.parse(getInstrumentation().getContext().getResources().getXml(R.xml.printer_configuration));
    }
}

7
हां लेकिन यह मूर्खतापूर्ण लगता है कि एंड्रॉइड सरल JUnit परीक्षणों में परीक्षण प्रोजेक्ट संदर्भ तक पहुंच प्रदान नहीं करता है। संदर्भ AndroidTestCase.mTestContext में है, लेकिन यह निजी है। मैं क्यों नहीं देख रहा हूँ।
पेन्सप्स

@peceps फुल ऐक - लेकिन बस यह कैसा है और मुझे न तो यह पसंद है न;)
AgentKnopf

25

जैसा कि आप AndroidTestCase स्रोत कोड में पढ़ सकते हैं , getTestContext()विधि छिपी हुई है।

/**
 * @hide
 */
public Context getTestContext() {
    return mTestContext;
}

आप @hideप्रतिबिंब का उपयोग करके एनोटेशन को बायपास कर सकते हैं ।

बस अपने में निम्न विधि जोड़ें AndroidTestCase:

/**
 * @return The {@link Context} of the test project.
 */
private Context getTestContext()
{
    try
    {
        Method getTestContext = ServiceTestCase.class.getMethod("getTestContext");
        return (Context) getTestContext.invoke(this);
    }
    catch (final Exception exception)
    {
        exception.printStackTrace();
        return null;
    }
}

फिर getTestContext()किसी भी समय आप चाहते हैं। :)


2
मेरे लिए पूरी तरह से काम किया है और मैं इस विधि के माध्यम से या तो AndroidTestCase के संदर्भ में संपत्ति का उपयोग कर लोड करता हूं, या गतिविधिInstrumentationTestCase2.getInstrumentation () .getContext () तब getResources () .getAssets ()
एंड्रयू मैकेंजी

क्या आप अनुमान लगा सकते हैं कि उन्होंने इसे क्यों छिपाया? यदि हम इस तकनीक का उपयोग करते हैं, तो क्या वे बाद में रिलीज़ (हमारे परीक्षण कोड को तोड़कर) विधि को दूर ले जा सकते हैं?
एंड्रयू शेफर्ड

1
मुझे मिलता हैjava.lang.NoSuchMethodException: android.test.ServiceTestCase.getTestContext()
kurdtpage

4

अद्यतन: AndroidTestCase इस वर्ग को एपीआई स्तर २४ में चित्रित किया गया था InstrumentationRegistry। इसके बजाय उपयोग करें । एंड्रॉइड टेस्टिंग सपोर्ट लाइब्रेरी का उपयोग करके नए परीक्षण लिखे जाने चाहिए। घोषणा करने के लिए लिंक

आपको TestCase के बजाय AndroidTestCase से विस्तार करना चाहिए।

AndroidTestCase क्लास ओवरव्यू
इस का विस्तार करें यदि आपको संसाधन या अन्य चीजों तक पहुंचने की आवश्यकता है जो गतिविधि संदर्भ पर निर्भर करते हैं।

AndroidTestCase - Android डेवलपर्स


4

यदि आप कोटलिन और मॉकिटो के साथ संदर्भ प्राप्त करना चाहते हैं, तो आप इसे निम्न तरीके से कर सकते हैं:

val context = mock(Context::class.java)

मुझे आशा है कि इसकी मदद से आप


संदर्भ में शून्य हो रही है?
देवेन

और आप @RunWith (MockitoJUnitRunner :: class) के साथ टेस्ट क्लास को एनोटेट करना न भूलें
USMAN osman

2

यह सही तरीका है प्रसंग पाने के लिए। अन्य विधियां पहले से ही पदावनत हैं

import androidx.test.platform.app.InstrumentationRegistry

InstrumentationRegistry.getInstrumentation().context

2
import androidx.test.core.app.ApplicationProvider;

    private Context context = ApplicationProvider.getApplicationContext();

1

स्वचालित परीक्षण बनाते समय इन समस्याओं का सामना करने वालों के लिए, आपको यह करना होगा:

    Context instrumentationContext;

    @Before
    public void method() {

        instrumentationContext = InstrumentationRegistry.getInstrumentation().getContext();

        MultiDex.install(instrumentationContext);
    }

0

अन्य उत्तर पुराने हैं। अभी हर बार जब आप AndroidTestCase का विस्तार करते हैं, तो mContext Context ऑब्जेक्ट होता है, जिसका आप उपयोग कर सकते हैं।

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