2015-05-28 8 views
8

मैं यूनिट परीक्षण के लिए नया हूं और मैं अपने SQLiteDataBase का परीक्षण करना चाहता हूं।एंड्रॉइड स्टूडियो यूनिट परीक्षण SQLiteDataBase शून्य

मैं एक वर्ग MySQLiteHelper कि SQLiteOpenHelper फैली नामित किया है। मेरे पास स्थानडेटा हैंडलर नाम का एक वर्ग है जिसका उपयोग मैं अपने डेटाबेस से तत्व जोड़ने या हटाने के लिए करता हूं। और मैं एक वर्ग LocationDataHandlerTest, कि AndroidTestCase फैली हुई है, मेरी LocationDataHandler वर्ग का परीक्षण करने के लिए है।

मैं अपने SQLite डेटाबेस का परीक्षण करने की कोशिश कर रहा हूं लेकिन मुझे लगता है कि सभी अलग-अलग संदर्भों के बीच थोड़ा सा खो गया है।

//Context context = new Activity(); 

//IsolatedContext context = getMockContext(); 

//Context context = new MockContext(); 

//Context context = getInstrumentation().getContext(); 

    Context context = getContext(); 

    helper = new MySQLiteHelper(context); 
    assertNotNull(helper); 

    SQLiteDatabase db = helper.getWritableDatabase(); 
    assertNotNull(db); <---- it fails here ! 

के रूप में आप देख सकते हैं मैं कई अलग अलग संदर्भों कि मैंने देखा लोगों का उपयोग करें और के साथ काम के साथ करने की कोशिश की:

यहाँ मेरी कोड है। मैं वास्तव में समझ में नहीं आता कि यह मेरे मामले में क्यों काम नहीं करता है।

मेरी समस्या यह है कि परीक्षण "assertNotNull (डीबी)" पर असफल रहा है; " जिसका अर्थ है कि मैं कभी भी अपना डेटाबेस पुनर्प्राप्त नहीं कर सकता।

क्या मैं यह गलत तरीका कर रहा हूं? क्या मैं सही संदर्भ का उपयोग नहीं कर रहा हूं?

संपादित:

junit.framework.AssertionFailedError 
    at junit.framework.Assert.fail(Assert.java:55) 
    at junit.framework.Assert.assertTrue(Assert.java:22) 
    at junit.framework.Assert.assertNotNull(Assert.java:256) 
    at junit.framework.Assert.assertNotNull(Assert.java:248) 
    at junit.framework.TestCase.assertNotNull(TestCase.java:417) 
    at com.databerries.LocationDataHandlerTest.testAddLocation(LocationDataHandlerTest.java:72) 
+0

क्या आप लॉगकैट जोड़ सकते हैं? विवरण में अपनी समस्या क्या है .. –

+0

क्या आपने 'getInstrumentation.getTargetContext()' की कोशिश की है? –

+0

हाँ, यह मुझे लाइन पर एक शून्य सूचक अपवाद फेंकता है: 'संदर्भ संदर्भ = getInstrumentation()। GetTargetContext(); ' –

उत्तर

1

हाँ, यह एक संदर्भ मुद्दा है: यहाँ मेरी logcat है। उन सभी संदर्भों (जिनमें आपने टिप्पणी की थी) सहित शून्य हैं।

आप एक संदर्भ बना सकते हैं:

context = new MockContext(); 
एक ही डाटाबेस (या अन्य संसाधनों) करने के लिए

आपके आवेदन, आप (जब से तुम AndroidTestCase उपयोग कर रहे हैं) के रूप में उपयोग कर सकते हैं:

context = getInstrumentation().getContext(); 

नहीं है RoamingDelegatingContext को बनाने और उपयोग करने का एक उचित तरीका है, लेकिन ऐसा नहीं लगता है कि आपको अपने परीक्षण के लिए इसकी आवश्यकता है।

आप परीक्षण के साथ कुछ मुद्दों और आवश्यक पहुंच/संसाधनों के स्तर को समझने में मदद के लिए Android Testing Fundamentals पढ़ने पर विचार कर सकते हैं।

+1

हाय! आपके उत्तर के लिए धन्यवाद लेकिन उन समाधानों में से कोई भी काम नहीं किया ... संदर्भ = नया MockContext(); मुझे वही त्रुटि देता है जो मेरा डेटाबेस शून्य है। और संदर्भ = getInstrumentation()। GetContext(); मुझे यह त्रुटि देता है: java.lang.NullPointerException com.databerries.LocationDataHandlerTest.testAddLocation (LocationDataHandlerTest.java:66) (रेखा 66 संदर्भ = getInstrumentation() के साथ पंक्ति है। getContext(); –

+0

@ थियोरार्डर्ड बदलने का प्रयास करें आपका टेस्ट प्रकार गतिविधि टेस्टकेस या इंस्ट्रुमेंटेशनटेस्टकेस पर। मुझे अभी एहसास हुआ कि मैंने प्रलेखन को गलत तरीके से पढ़ा और सोचा कि एंड्रॉइड टेस्टकेस इंस्ट्रुमेंटेशनटेस्टकेस का उप-वर्ग था (यह वास्तव में गतिविधि टेस्टकेस है जो सबक्लास है)। फिर आप getInstrumentation()। GetContext() कॉल को पुनः प्रयास कर सकते हैं। – iheanyi

+1

अभी भी वही त्रुटि, java.lang.NullPointerException com.databerries.LocationDataHandlerTest.testAddLocation (LocationDataHandlerTest. जावा: 66) (लाइन 66 संदर्भ = getInstrumentation() के साथ लाइन है। GetContext();) –

0

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

इसलिए हम RenamingDelegatingContext का उपयोग कर इन प्रकार के संचालन को दूर करते हैं। यह वर्ग दिए गए संदर्भ में प्रतिनिधि है, लेकिन एक नामित डेटाबेस/फ़ाइल नाम द्वारा डेटाबेस और फ़ाइल संचालन करता है। आप निम्नलिखित के रूप में संदर्भ का उपयोग करना चाहिए:

RenamingDelegatingContext context = new RenamingDelegatingContext(getContext(), "test_db"); 
helper = new MySQLiteHelper(context); 
assertNotNull(helper); 
SQLiteDatabase db = helper.getWritableDatabase(); 
assertNotNull(db); 
+0

asserNotNull (डीबी); कथन अभी भी विफल रहता है ... –

+0

@ थियोरोचार्ड ने आपके हेल्पर क्लास की जांच की है यदि डेटाबेस निर्माण के लिए कोड सही हैं? –

0

एंड्रॉयड स्टूडियो के साथ परीक्षण के लिए,

आप MockContext बजाय RenamingDelegatingContext उपयोग करना चाहिए।

InstrumentationTestCase का उपयोग करें।

अधिक जानकारी के लिए, यह उत्तर देखें। https://stackoverflow.com/a/29063736/1020456

मेरा कोड यहां है।

public class DatabaseHelperTest extends InstrumentationTestCase{ 

private DatabaseHelper db; 

@Before 
public void setUp() throws Exception { 
    super.setUp(); 

    MockContext context = new MockContext(); 
    db = DatabaseHelper.getInstance(context); 
} 

@After 
public void tearDown() throws Exception { 
    db.close(); 
    super.tearDown(); 
} 

public void testInsertUserInteraction() throws Exception { 
    assertNotNull(db.getReadableDatabase()); //should pass 
} 

}

1

AndroidTestCase से अपने परीक्षण वर्ग का विस्तार करें और कोड नमूना नीचे की तरह mContext का उपयोग करें:

public class MyDbHelperTest extends AndroidTestCase { 

private DatabaseHelper db; 

@Before 
public void setUp() throws Exception { 
    super.setUp(); 
    db = DatabaseHelper.getInstance(mContext); 
} 

@After 
public void tearDown() throws Exception { 
    db.close(); 
    super.tearDown(); 
} 

public void testOpeningDb() throws Exception { 
    assertNotNull(db); 
    SQLiteDatabase sqliteDb = db.getWritableDatabase(); 
    assertNotNull(sqliteDb); 
    } 

}

mContextAndroidTestCase वर्ग से इस वर्ग के लिए विरासत में मिला है। यह काम करेगा क्योंकि मुझे एक ही समस्या थी।

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