2011-03-11 17 views
10

Verileri ağda yüklenen bir hizmetten alan İçerik Sağlayıcısı'nı uygulamamıştım. İçerik sağlayıcı Bu İçeriği sağlayıcı için birim testi kullanmak gerekli paylaşılan tercihlerinden parametreler (kullanıcı kimlik bilgilerini, uygulama adı, vb)DesteklenmeyenOperationException, getSharedPreferences() öğesini birim testten çağırırken

SharedPreferences settings = getContext().getSharedPreferences(NET_PREFS, 0); 

alır:


public class ResearchProviderTest extends ProviderTestCase2<MyProvider>{ 

    public ResearchProviderTest() {  
     super(MyProvider.class, MyProvider.CONTENT_AUTHORITY); 
    } 

    public void testInsert() { 

     ContentValues values = new ContentValues();   
     values.put(QueryFields.FIELD_QUERY_TEXT, "query"); 

     Uri newUri = getMockContentResolver().insert(MyProvider.CONTENT_URI, values); 

     Cursor readMessagesCursor = getMockContentResolver().query(
       newUri , 
         new String[] { FIELD_SR_TITLE }, 
         null, null, null); 
     assertTrue("The cursor should contain some entries", readMessagesCursor.moveToFirst()); 
    } 
} 

birim testinin yürütülmesi sırasında. istisnası atılır:


java.lang.UnsupportedOperationException 
    at android.test.mock.MockContext.getSharedPreferences(MockContext.java:127) 
    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146) 
    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146) 
    at com.company.mobile.android.net.RemoteExecutor.retrieveCredentials(RemoteExecutor.java:171) 
    at com.company.mobile.android.net.service.Adapter.executeSearch(Adapter.java:33) 
    at com.company.mobile.android.provider.MyProvider.insert(MyProvider.java:167) 
    at android.content.ContentProvider$Transport.insert(ContentProvider.java:174) 
    ... 

herkes MockContext paylaşıldı Tercihler geçmesine biliyor mu? İçerik Sağlayıcıyı test ederken İçeriğe gereksinim duyarsam başka bir yaklaşım kullanmalı mıyım?

cevap

6

Sen AndroidTestCase.setContext() kullanarak MockContext uzanır ve en az getPackageName() ve getSharedPreferences() geçersiz kılan bir Context enjekte etmek zorunda.

Ne yazık ki, setContext() onurlandırılmadığından MockContext - ProviderTestCase2 enjekte etmek mümkün değildir. Daha sonra çözüm, süper yöntemi çağırmamak için setUp()'u geçersiz kılmaktır.

package com.example.aatg.ps.test; 

import android.test.ProviderTestCase2; 

import com.example.aatg.ps.ProviderSample; 

public class ProviderSampleTests extends ProviderTestCase2<ProviderSample> { 

    private ResolverRenamingMockContext mProviderContext; 
    private Class<ProviderSample> mProviderClass; 
    private ProviderSample mProvider; 
    private String mProviderAuthority; 

    public ProviderSampleTests() { 
     super(ProviderSample.class, ProviderSample.AUTHORITY); 
     setName("ProviderSampleTests"); 
     mProviderClass = ProviderSample.class; 
     mProviderAuthority = ProviderSample.AUTHORITY; 
    } 

    @Override 
    protected void setUp() throws Exception { 
     // We should not invoke super.setUp() here to avoid the UnsupportedOperationException. 
     //super.setUp(); 

     // This is needed to support getSharedPreferences() in ProviderSample.onCreate() 
     mProviderContext = new ResolverRenamingMockContext(getContext()); 
     mProvider = mProviderClass.newInstance(); 
     assertNotNull(mProvider); 
     mProvider.attachInfo(mProviderContext, null); 
     mProviderContext.addProvider(mProviderAuthority, mProvider); 
    } 


    @Override 
    public ProviderSample getProvider() { 
     return mProvider; 
    } 

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

    public void testProviderSampleCreation() { 
     ProviderSample provider = getProvider(); 
     assertNotNull(provider); 
    } 
} 

Ve bu ResolverRenamingMockContext geçerli:

package com.example.aatg.ps.test; 

import java.io.File; 

import android.content.ContentProvider; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.res.Resources; 
import android.test.IsolatedContext; 
import android.test.mock.MockContentResolver; 
import android.test.mock.MockContext; 

/** 
* @author diego 
* 
*/ 
public class ResolverRenamingMockContext extends IsolatedContext { 

    /** 
    * The renaming prefix. 
    */ 
    private static final String PREFIX = "test."; 


    /** 
    * The resolver. 
    */ 
    private static final MockContentResolver RESOLVER = new MockContentResolver(); 

    /** 
    * Constructor. 
    * @param context 
    */ 
    public ResolverRenamingMockContext(Context context) { 
     super(RESOLVER, new DelegatedMockContext(context)); 
    } 

    public MockContentResolver getResolver() { 
     return RESOLVER; 
    } 

    public void addProvider(String name, ContentProvider provider) { 
     RESOLVER.addProvider(name, provider); 
    } 

    /** 
    * The DelegatedMockContext. 
    * 
    */ 
    private static class DelegatedMockContext extends MockContext { 

     private Context mDelegatedContext; 

     public DelegatedMockContext(Context context) { 
      mDelegatedContext = context; 
     } 

     @Override 
     public SharedPreferences getSharedPreferences(String name, int mode) { 
      return mDelegatedContext.getSharedPreferences(PREFIX + name, mode); 
     } 
    } 

} 
+0

bir ana bir sorundur. Bağlamı enjekte etmenin bir yolunu bulamadım – Glaxalg

1

sadece yerine ProviderTestCase2 ait AndroidTestCase uzatmak VE getContext()

0

Bir MyHelper sınıfa Paylaşılan Tercihler tüm kullanımlarını itmek İçerik Sağlayıcı planı ayrı kullanın.

Varsayılan MyHelper uygulaması, şimdi kullandığınız gibi Paylaşılan Tercihleri ​​kullanabilir ve ihtiyacınız olan değerleri döndürme yoluyla döndürür.

Test sırasında, Paylaşılan Tercihleri ​​kullanmayan özel bir MyHelper uygulaması enjekte edebilirsiniz. Belki de TestingHelper denir, sadece testlerle tanımlanan sabitleri döndürür. ResearchProviderTest Örneğin

: içeriği enjekte

@Override 
protected void setUp() throws Exception { 
    // set up normally 
    super.setUp(); 

    // inject a special helper for testing 
    MyProvider provider = (MyProvider) getProvider(); 
    provider.setHelper(new TestingHelper()); 
} 
İlgili konular