2009-08-01 5 views
10

पर सामग्री प्रदाताओं का परीक्षण कैसे करें मैं ProviderTestCase2<T> का उपयोग करके अपने डीबी का परीक्षण करने की कोशिश कर रहा हूं। मैं परीक्षण डीबी बनाया जा रहा देख सकते हैं। जैसा कि मुझे लगता है, परीक्षण सामग्री प्रदाता परीक्षण डीबी का उपयोग करना चाहिए। लेकिन जैसे ही मैं MockContentResolver (या newResolverWithContentProviderFromSql के साथ बनाया गया) के खिलाफ किसी भी कॉल का प्रयास करता हूं, मुझे UnsupportedOperationException मिलता है। यह सामान्य व्यवहार के रूप में MockContentResolver के लिए प्रलेखित है। जैसे कि मैं ProviderTestCase2 के उद्देश्य पर थोड़ा अनिश्चित हूं।एंड्रॉइड

आप अपने सामग्री प्रदाताओं का परीक्षण कैसे करते हैं?

धन्यवाद

उत्तर

3

getMockContentResolver() को ओवरराइड और MockContentResolver से ली गई अपनी खुद की कक्षा वापस जाने के लिए बढ़ाएँ ProviderTestCase2।

public class MyProviderTestCase2 extends ProviderTestCase2 { 
    @Override 
    public MockContentResolver getMockContentResolver() { 
     return new MyMockContentResolver(); 
    } 
} 

MyMockContentResolver किसी भी तरीकों से आप अपने ContentProvider में परीक्षण करना चाहते हैं ओवरराइड करने के लिए की आवश्यकता होगी।

तो फिर तुम, जबकि यह, जहां तक ​​मैंने पाया ProviderTestCase2

द्वारा अलग है
13

नकली सामग्री समाधानकर्ता की स्थापना किसी भी परीक्षण के लिए अपनी सामग्री प्रदाता पर आप चाहते हैं चलाने के लिए सक्षम होना चाहिए स्पष्ट रूप से आवश्यक नहीं है - मैं ऐसे मामलों में जहां की देखरेख हो सकता है यह (यूआरआइ के माध्यम से प्रदाता, hings corect GetType (आवश्यक है) काम करने का हल करने शायद सही) है, लेकिन मेरे लिए, यह कुछ इस तरह करने के लिए पर्याप्त था: मैं इस प्रविष्टि जोड़ने के रूप में मैं यह लगता है

package org.droidcon.apps.template.provider.test; 

import org.droidcon.apps.template.provider.ProfileContract; 
import org.droidcon.apps.template.provider.ProfileProvider; 

import android.content.ContentProvider; 
import android.content.ContentValues; 
import android.database.Cursor; 
import android.net.Uri; 
import android.test.ProviderTestCase2; 

public class ProfileProviderTest extends ProviderTestCase2<ProfileProvider> { 

    public ProfileProviderTest() { 
     super(ProfileProvider.class, ProfileProvider.class.getName()); 
    } 

    protected void setUp() throws Exception { 
     super.setUp(); 
    } 


    /** 
    * Very basic query test. 
    * 
    * Prerequisites: 
    * <ul> 
    * <li>A provider set up by the test framework 
    * </ul> 
    * 
    * Expectations: 
    * <ul> 
    * <li> a simple query without any parameters, before any inserts returns a 
    * non-null cursor 
    * <li> a wrong uri results in {@link IllegalArgumentException} 
    * </ul> 
    */ 
    public void testQuery(){ 
     ContentProvider provider = getProvider(); 

     Uri uri = ProfileContract.CONTENT_URI; 

     Cursor cursor = provider.query(uri, null, null, null, null); 

     assertNotNull(cursor); 

     cursor = null; 
     try { 
      cursor = provider.query(Uri.parse("definitelywrong"), null, null, null, null); 
      // we're wrong if we get until here! 
      fail(); 
     } catch (IllegalArgumentException e) { 
      assertTrue(true); 
     } 
    } 
} 
+0

इंटरनेट पर ProviderTestCase2 कक्षा पर बहुत अधिक नमूना कोड नहीं है। यह बहुत उपयोगी है। – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+1

[एंड्रॉइड प्रलेखन] में (http://developer.android.com/tools/testing/contentprovider_testing.html#WhatToTest), वे अनुशंसा करते हैं कि आप सीधे अपने सामग्री प्रदाता का उपयोग न करें और इसके बजाय सामग्री रिज़ॉल्वर से गुज़रें। सामग्री प्रदाता का परीक्षण करने के तरीके के बारे में अधिक पर्याप्त उदाहरण देखने के लिए बस मेरी पोस्ट पढ़ें। – eternay

6

प्रोग्रामर की मदद कर सकते हैं जो उनके सामग्री प्रदाता का परीक्षण करना चाहते हैं।

कल्पना करें कि आपके सामग्री प्रदाता को MyProvider कहा जाता है और आपके पास कुछ स्थिरांक परिभाषित MyProviderContract नामक कॉन्ट्रैक्ट क्लास है।

सबसे पहले, आप MyProviderTestCase नामक एक टेस्ट क्लास लिखेंगे जो ProviderTestCase2<MyProvider> से प्राप्त होता है। आप जो super निर्माता फोन करेगा एक निर्माता को परिभाषित करना होगा: (अपनी सामग्री प्रदाता के उपयोगकर्ताओं के लिए यह सीधे नहीं पहुंच सकेगी रूप getProvider() उपयोग करने से बचें) के बजाय सीधे अपने प्रदाता का उपयोग करने का, तो फिर

public MyProviderTestCase() { 
    super(MyProvider.class, MyProviderContract.AUTHORITY); 
} 

, का उपयोग getMockContentResolver() किसी सामग्री रिज़ॉल्वर का संदर्भ प्राप्त करने के लिए और फिर इस सामग्री रिज़ॉल्वर के तरीकों को कॉल करें (query, insert, आदि)। निम्नलिखित कोड में, मैं दिखाता हूं कि insert विधि का परीक्षण कैसे करें।

public void testInsert() { 
    Uri uri = MyProviderContract.CONTENT_URI; 
    ContentValues values = new ContentValues(); 
    values.put(MyProviderContract.FIELD1, "value 1"); 
    values.put(MyProviderContract.FIELD2, "value 2"); 
    Uri resultingUri = getMockContentResolver().insert(uri, values); 
    // Then you can test the correct execution of your insert: 
    assertNotNull(resultingUri); 
    long id = ContentUris.parseId(resultingUri); 
    assertTrue(id > 0); 
} 

तो फिर तुम के रूप में कई परीक्षण तरीकों के रूप में आप चाहते हैं जोड़ सकते हैं, सीधे अपने सामग्री प्रदाता के बजाय एक सामग्री समाधानकर्ता का उपयोग कर, के रूप में अपनी सामग्री प्रदाता की उन करना होगा।

+1

आप ProviderTestCase कैसे चला सकते हैं? एंड्रॉइड यूनिट टेस्ट वर्जन या इंस्ट्रुमेंटेशन टेस्ट का निर्माण? – MRodrigues