我实现了内容提供者,它从网络上安装的服务中检索数据.
内容提供者从共享首选项(用户凭据,应用程序名称等)获取所需参数
内容提供者从共享首选项(用户凭据,应用程序名称等)获取所需参数
- SharedPreferences settings = getContext().getSharedPreferences(NET_PREFS,0);
我为此内容提供商使用单元测试
- 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 );
- assertTrue("The cursor should contain some entries",readMessagesCursor.moveToFirst());
- }
- }
在执行单元测试期间.抛出异常:
- 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)
- ...
有人知道如何将共享首选项传递给MockContext?在测试内容提供商期间是否需要Context时,应该使用其他方法吗?
解决方法
您必须注入一个使用
AndroidTestCase.setContext()扩展MockContext的上下文,并至少覆盖getPackageName()和getSharedPreferences().
不幸的是,由于setContext()不被赋值,所以不可能将MockContext注入到ProviderTestCase2中.那么解决方案是重写setUp()而不是调用super方法.
- 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);
- }
- }
这是ResolverRenamingMockContext:
- 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);
- }
- }
- }