- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经实现了从安装在网络上的服务中检索数据的内容提供程序。内容提供者从共享首选项(用户凭据、应用程序名称等)中获取所需参数
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, 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 吗?如果我在测试 Content Provider 时需要 Context,我应该使用其他方法吗?
最佳答案
您必须使用 AndroidTestCase.setContext() 注入(inject)扩展 MockContext
的 Context
并至少覆盖 getPackageName()
和 getSharedPreferences()
。
不幸的是,无法将 MockContext
注入(inject)到 ProviderTestCase2
中,因为 setContext() 不可用。然后,解决方案是重写 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);
}
}
}
关于android - 从单元测试调用 getSharedPreferences() 时出现 UnsupportedOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267671/
我已经构建了 2 个项目,我的主要项目和一个 Twitter 发布项目。我已经将 twitter 导入到 main 中,现在正在尝试将其连接起来。下面是导入代码。问题是我知道我遗漏了一些可能与上下文有
我是 Android Studio 的新手,所以遇到抽象方法 getSharedPreferences()。 我开始怀疑我所了解的抽象方法是否属实。所以基本上。 我阅读了 Android 开发者网站上
基本上,我的服务会显示一条通知,如果用户愿意,可以将其关闭。 该设置由应用程序内部控制,并通过 PreferenceActivity 进行设置。 退出 Activity 时: public void
我正在使用 SharedPreferences 来获取一些保存的值。我只在某些设备上得到空指针异常。当我在自己的设备中测试代码时,我没有遇到任何问题。但是我的一些用户收到了错误。 这是我获取 Shar
只要“new score”大于oldscore,我就会尝试保存一个新值(按钮的点击次数)。使用 TextView 我会在用户点击按钮时显示点击次数,当时间结束时我想用另一个 TextView 显示分数
public static void GetAllPoints(final IGetAllPointsCallBack callBack) { SharedPreferences ent
你好,我有 getSharedPreferences 无法解决,我搜索了很多答案,但任何解决这个问题的方法。如何实现onclick iside ViewHolder中的getSharedPrefere
我是 Java 和 Android 开发的初学者,对首选项有疑问。 一个教程要求我使用首选项来读取和保存调用 onCreate 方法的时间。 我已经解决这个问题至少两天了,但一无所获。谁能举例说明如何
我在从非 Activity 类读取 getSharedPreferences 以在播放器中设置播放列表时遇到问题...在我的 Activity 中,我从 edittext 中获取字符串变量以获取文件夹
我的类(class)是用 Kotlin 编写的,这是我的 SharedPreferenceHandler class SharedPreferenceHandler(sharedPrefs: S
我有一个扩展AppCompatActivity的登录类,但是当我想检查我的数据并使用getSharedPreferences()时,它出现运行时错误并且将强制停止!我该怎么办? 这是我的代码: pac
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我需要访问 updateBaseContextLocale 上的 SharedPreferences,它在 onCreate 之前运行。当我从 updateBaseContextLocale 调用 S
这可能是 Android 101,但我现在已经习惯了 SDK。无论如何,我根本不明白这个错误。我想根据我的共享首选项文件更新一些复选框选择,我使用以下方法: private void updatePr
我有一个扩展 SurfaceView 的 GamePanel 类,所以我不能为 SharedPreferences 扩展 Activity。如何在不扩展类的情况下使用 getSharedPrefere
在我的应用程序中,我需要根据用户存储在 SharedPreference 变量中的值声明一个数组。问题是数组需要在静态 block 中声明,因为在我的类中调用 onCreate() 之前需要声明数组的
用这些行: String app_name = "@string/app_name"; SharedPreferences sharedPreferences = getSharedPreferenc
我正在尝试使用对话框中的首选项,但遇到了一些困难。我的应用程序的其余部分只使用 getPreferences() 对话框,似乎没有任何问题。但是,Dialog 不能调用 getPreferences(
请帮帮我。我不知道这段代码有什么问题: import android.appwidget.AppWidgetProvider; import android.content.SharedPrefere
我已经实现了从安装在网络上的服务中检索数据的内容提供程序。内容提供者从共享首选项(用户凭据、应用程序名称等)中获取所需参数 SharedPreferences settings = getContex
我是一名优秀的程序员,十分优秀!