17

我编写了一个使用Context第三方库和SharedPreferences来自PreferenceManager.

可以模拟Context,第三方库可以使用一些模拟框架来模拟,但是怎么办PreferenceManager

我有两种方法:

public void saveString(ThirdPartyObject obj) {
    SharedPreferences appPreferences = 
        PreferenceManager.getDefaultSharedPreferences(mContext);
    SharedPreferences.Editor editor = appPreferences.edit();
    editor.putString(mContext.getString(
        R.string.preferences_string_name), obj.getString());
    editor.commit();
}

和相应的,加载首选项。

4

2 回答 2

5

看起来您实际上并不想要一个模拟实例PreferenceManager(主要用于 a PreferenceFragmentor PreferenceActivity)。

您可能想要:

  1. 一个 mock SharedPreferences,在这种情况下你可以模拟Context#getSharedPreferencesPreferenceManager#getDefaultSharedPreferences无论如何都会调用它)。如果编辑了首选项,您可能还必须进行模拟SharedPreferences.Editor,如上所述。你说你已经知道如何模拟上下文,所以这应该相当简单。

  2. 使用环境中的实际偏好。这是最简单的,也不一定是个坏主意。请确保它已正确清理,以便您的测试不会相互干扰(或者,根据您的测试环境,不受手动使用应用程序的影响)。

如果你真的模拟PreferenceManager实例(比如你进入PreferenceFragmentor PreferenceActivity),你绝对可以这样做。

由于它不是最终的,您可以生成一个模拟PreferenceManagerSharedPreferences使用 Mockito(或另一个模拟库),只要您有一种方法可以将它提供给您的代码,无论您通常会得到一个(在非测试代码中,这通常来自getPreferenceManager())。

于 2013-03-07T07:02:44.443 回答
3

您可以使用专门的上下文来共享偏好。RenamingDelegatingContext将所有内容委托给 Context。当我们从 a 访问 SharedPreference 时Context,我们使用getSharedPreferences(String name, int mode).

这里通过扩展RenamingDelegatingContext我们覆盖 getSharedPreferences 并用 test 假装 name 参数PREFIX,所以当测试运行时它将写入不同于主应用程序的首选项文件。

public class SpecializedMockContext extends RenamingDelegatingContext {
    public static final String PREFIX = "test.";

    public SpecializedMockContext(Context context) {
        super(context, PREFIX);
    }

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

将此 SpecialisedMockContext 设置为您的测试应用程序上下文。setContext(specialisedMockContext)createApplication()

于 2016-02-06T04:47:19.853 回答