如何在Android中模拟PreferenceManager?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (39)

我写了一个正在使用的类,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();
}
提问于
用户回答回答于

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

这里通过扩展RenamingDelegatingContext我们覆盖getSharedPreferences并用测试假装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);
    }
}
用户回答回答于

它看起来并不像你真正想要的模拟实例PreferenceManager(其中大部分是在使用PreferenceFragmentPreferenceActivity)。

你可能需要:

  1. 一个模拟SharedPreferences,在这种情况下,你可以嘲笑Context#getSharedPreferencesPreferenceManager#getDefaultSharedPreferences无论如何被调用)。如上所述,如果编辑偏好,您可能还必须进行模拟SharedPreferences.Editor。你说你已经知道如何嘲笑上下文,所以这应该是相当简单的。
  2. 使用环境中的实际偏好。这是最简单的,并不一定是个坏主意。确保它的正确清理,以便测试不会互相干扰(或者,根据您的测试环境,不受手动使用该应用程序的影响)。

扫码关注云+社区