2010-09-24 19 views
5

से डिवाइस पर डेटाबेस टेस्ट फ़िक्स्चर को कैसे स्थानांतरित कर सकता हूं, मैं एक एंड्रॉइड जुनीट टेस्ट लिख रहा हूं और एक टेस्ट फ़िक्स्चर फ़ाइल कॉपी/रीसेट करना चाहता हूं (यह एक SQLite डेटाबेस फ़ाइल है।) यदि मैं मुख्य के भीतर था आवेदन, मुझे पता है कि मैं सिर्फ संपत्ति निर्देशिका में फ़ाइल रख सकता हूं और getResources().getAssets().open(sourceFile)मैं अपने यूनिट टेस्ट एप्लिकेशन

हालांकि, यह API ActivityInstrumentationTestCase2 कक्षा से अनुपलब्ध प्रतीत होता है।

क्या परीक्षण पीसी से फ़ाइल कॉपी करने का कोई आसान तरीका है, या क्या मुझे डिवाइस पर परीक्षण फ़िक्स्चर की ताजा प्रतिलिपि रखना चाहिए और इसे अस्थायी फ़ाइल पर कॉपी करना चाहिए?

धन्यवाद!

उत्तर

3

मैंने इसे पूरा करने के लिए क्या किया है (बहुत ही सुरुचिपूर्ण तरीके से) परीक्षण डिवाइस को मेरे डिवाइस (या नकली डिवाइस) पर कॉपी करना है। मैंने इसे "cleantestdatabase.db" नाम दिया है। फिर परीक्षण कोड में, मैं इसे "testdatabase.db" पर कॉपी करता हूं, ताकि मैं इसे अपने परीक्षणों के साथ संशोधित कर सकूं लेकिन इसे किसी ज्ञात स्थिति में रीसेट कर सकूं। यहां कोड है:

copyFile("cleantestdatabase.db", "testdatabase.db"); 

private void copyFile(String source, String dest) throws IOException{ 
    String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath() + getActivity().getString(R.string.default_dir); 
    File newDir = new File(rootPath); 
    boolean result = newDir.mkdir(); 
    if(result == false){ 
     Log.e("Error", "result false"); 
    } 

    InputStream in = new FileInputStream(rootPath + source);  
    File outFile = new File(rootPath + dest); 
    if(outFile.exists()) { 
     outFile.delete(); 
    } 
    outFile.createNewFile(); 

    OutputStream out = new FileOutputStream(outFile); 
    byte[] buf = new byte[1024]; 
    int len; 
    while ((len = in.read(buf)) > 0) { 
     out.write(buf, 0, len); 
    } 
    in.close(); 
    out.close(); 
} 
6

आपके परीक्षण आवेदन और आपके मुख्य अनुप्रयोग में संसाधन एक उपकरण परीक्षण मामले में अलग-अलग पहुंच योग्य हैं। आप उन संसाधनों परीक्षण परियोजना की रेस/कच्चे या संपत्ति फ़ोल्डर में हैं उपयोग करना चाहते हैं, तो आप आवेदन में उपयोग कर सकते हैं

getInstrumentation().getContext().getResources() 

उन संसाधनों तक पहुंच के लिए परीक्षण किया जा रहा ('लक्ष्य' आवेदन),

का उपयोग
getInstrumentation().getTargetContext().getResources() 

नोट, हालांकि, आप संपत्ति फ़ोल्डर में फ़ाइलों को कभी भी संशोधित नहीं कर सकते हैं;

getResources().getAssets().open(sourceFile) 

एक इनपुटस्ट्रीम देता है। फ़ाइल को संशोधित करने का कोई तरीका नहीं है। ऐसा इसलिए है क्योंकि संपत्ति एपीके के अंदर संपीड़ित होती है, और वास्तव में बिल्कुल लिखने योग्य नहीं होती है।

यदि आप जो करना चाहते हैं, उस फाइल के पथ को संशोधित करें जो आप परीक्षण कर रहे हैं, तो आपको ActivityUnitTestCase और setActivityContext()RenamingDelegatingContext के साथ उपयोग करना चाहिए। यह आपको निर्देशिका उपसर्ग निर्दिष्ट करके एक नई निर्देशिका में किसी संदर्भ में फ़ाइल और डेटाबेस पहुंच को पुनर्निर्देशित करने की अनुमति देता है। आप अधिकांश परिचालनों के लिए लक्ष्य संदर्भ को लपेटने के लिए more complex constructor का भी उपयोग कर सकते हैं, लेकिन फ़ाइल ऑपरेशन के लिए अपने परीक्षण अनुप्रयोग के संदर्भ का उपयोग करें, इसलिए गतिविधि प्राथमिक एप्लिकेशन की बजाय परीक्षण एप्लिकेशन में संग्रहीत फ़ाइलों तक पहुंच जाएगी लेकिन फिर भी प्राथमिक एप्लिकेशन में अन्य संसाधनों का उपयोग करें ।

+0

महान उत्तर के लिए बहुत बहुत धन्यवाद। मैं देखता हूं कि एंड्रॉइड परीक्षण के बारे में अभी भी मुझे बहुत कुछ सीखना है। जब मैं इन समाधानों में से किसी एक को कार्यान्वित करने में सक्षम हूं तो मैं आपको अपडेट करूंगा। –

+0

जब मैंने इनपुट परीक्षण को = getResources() में निष्पादित करने का प्रयास किया। GetAssets()। मेरे परीक्षण अनुप्रयोग में खोलें ("test.txt"), और मेरी संपत्ति निर्देशिका में "test.txt" नाम की एक फ़ाइल रखी, मुझे अपवाद मिला । –

+1

@glenviewjeff आप किस संदर्भ में कॉल कर रहे थे स्रोत स्रोत()? एक परीक्षण विधि में या एक परीक्षण से शुरू की गई गतिविधि के अंदर? क्या आप सुनिश्चित हैं कि आप जिस 'संसाधन' का उपयोग कर रहे थे वह इंस्ट्रुमेंटेशन के 'getContext()' से आया था और 'getTargetContext() 'नहीं था? –

संबंधित मुद्दे