android – 从单元测试调用getSharedPreferences()时,UnsupportedOperationException异常

前端之家收集整理的这篇文章主要介绍了android – 从单元测试调用getSharedPreferences()时,UnsupportedOperationException异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我实现了内容提供者,它从网络上安装的服务中检索数据.
内容提供者从共享首选项(用户凭据,应用程序名称等)获取所需参数
  1. SharedPreferences settings = getContext().getSharedPreferences(NET_PREFS,0);

我为此内容提供商使用单元测试

  1. public class ResearchProviderTest extends ProviderTestCase2<MyProvider>{
  2.  
  3. public ResearchProviderTest() {
  4. super(MyProvider.class,MyProvider.CONTENT_AUTHORITY);
  5. }
  6.  
  7. public void testInsert() {
  8.  
  9. ContentValues values = new ContentValues();
  10. values.put(QueryFields.FIELD_QUERY_TEXT,"query" );
  11.  
  12. Uri newUri = getMockContentResolver().insert(MyProvider.CONTENT_URI,values);
  13.  
  14. Cursor readMessagesCursor = getMockContentResolver().query(
  15. newUri,new String[] { FIELD_SR_TITLE },null,null );
  16. assertTrue("The cursor should contain some entries",readMessagesCursor.moveToFirst());
  17. }
  18. }

在执行单元测试期间.抛出异常:

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

有人知道如何将共享首选项传递给MockContext?在测试内容提供商期间是否需要Context时,应该使用其他方法吗?

解决方法

您必须注入一个使用 AndroidTestCase.setContext()扩展MockContext的上下文,并至少覆盖getPackageName()和getSharedPreferences().

不幸的是,由于setContext()不被赋值,所以不可能将MockContext注入到ProviderTestCase2中.那么解决方案是重写setUp()而不是调用super方法.

  1. package com.example.aatg.ps.test;
  2.  
  3. import android.test.ProviderTestCase2;
  4.  
  5. import com.example.aatg.ps.ProviderSample;
  6.  
  7. public class ProviderSampleTests extends ProviderTestCase2<ProviderSample> {
  8.  
  9. private ResolverRenamingMockContext mProviderContext;
  10. private Class<ProviderSample> mProviderClass;
  11. private ProviderSample mProvider;
  12. private String mProviderAuthority;
  13.  
  14. public ProviderSampleTests() {
  15. super(ProviderSample.class,ProviderSample.AUTHORITY);
  16. setName("ProviderSampleTests");
  17. mProviderClass = ProviderSample.class;
  18. mProviderAuthority = ProviderSample.AUTHORITY;
  19. }
  20.  
  21. @Override
  22. protected void setUp() throws Exception {
  23. // We should not invoke super.setUp() here to avoid the UnsupportedOperationException.
  24. //super.setUp();
  25.  
  26. // This is needed to support getSharedPreferences() in ProviderSample.onCreate()
  27. mProviderContext = new ResolverRenamingMockContext(getContext());
  28. mProvider = mProviderClass.newInstance();
  29. assertNotNull(mProvider);
  30. mProvider.attachInfo(mProviderContext,null);
  31. mProviderContext.addProvider(mProviderAuthority,mProvider);
  32. }
  33.  
  34.  
  35. @Override
  36. public ProviderSample getProvider() {
  37. return mProvider;
  38. }
  39.  
  40. protected void tearDown() throws Exception {
  41. super.tearDown();
  42. }
  43.  
  44. public void testProviderSampleCreation() {
  45. ProviderSample provider = getProvider();
  46. assertNotNull(provider);
  47. }
  48. }

这是ResolverRenamingMockContext:

  1. package com.example.aatg.ps.test;
  2.  
  3. import java.io.File;
  4.  
  5. import android.content.ContentProvider;
  6. import android.content.Context;
  7. import android.content.SharedPreferences;
  8. import android.content.res.Resources;
  9. import android.test.IsolatedContext;
  10. import android.test.mock.MockContentResolver;
  11. import android.test.mock.MockContext;
  12.  
  13. /**
  14. * @author diego
  15. *
  16. */
  17. public class ResolverRenamingMockContext extends IsolatedContext {
  18.  
  19. /**
  20. * The renaming prefix.
  21. */
  22. private static final String PREFIX = "test.";
  23.  
  24.  
  25. /**
  26. * The resolver.
  27. */
  28. private static final MockContentResolver RESOLVER = new MockContentResolver();
  29.  
  30. /**
  31. * Constructor.
  32. * @param context
  33. */
  34. public ResolverRenamingMockContext(Context context) {
  35. super(RESOLVER,new DelegatedMockContext(context));
  36. }
  37.  
  38. public MockContentResolver getResolver() {
  39. return RESOLVER;
  40. }
  41.  
  42. public void addProvider(String name,ContentProvider provider) {
  43. RESOLVER.addProvider(name,provider);
  44. }
  45.  
  46. /**
  47. * The DelegatedMockContext.
  48. *
  49. */
  50. private static class DelegatedMockContext extends MockContext {
  51.  
  52. private Context mDelegatedContext;
  53.  
  54. public DelegatedMockContext(Context context) {
  55. mDelegatedContext = context;
  56. }
  57.  
  58. @Override
  59. public SharedPreferences getSharedPreferences(String name,int mode) {
  60. return mDelegatedContext.getSharedPreferences(PREFIX + name,mode);
  61. }
  62. }
  63.  
  64. }

猜你在找的Android相关文章