如何在Android中模拟PreferenceManager?

pix*_*xel 17 android unit-testing mocking android-preferences

我写了一个正在使用的类,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();
}
Run Code Online (Sandbox Code Playgroud)

和相应的,加载首选项.

Jer*_*man 5

它看起来不像你真的想要一个模拟实例PreferenceManager(主要用于PreferenceFragmentPreferenceActivity).

您可能想要:

  1. 一个模拟SharedPreferences,在这种情况下你可以只是模拟Context#getSharedPreferences(PreferenceManager#getDefaultSharedPreferences无论如何调用).SharedPreferences.Editor如上所述,如果编辑首选项,您可能还需要进行模拟.你说你已经知道如何模拟上下文,所以这应该是相当简单的.

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

如果你真的想要嘲笑PreferenceManager实例(如您在得到PreferenceFragmentPreferenceActivity),你可以完全做到这一点.

因为它是非final的,你可以生成一个模拟PreferenceManagerSharedPreferences使用Mockito(或另一个模拟库),只要你有办法将它提供给你的代码,无论你通常得到一个(在非测试代码中,这通常来自的getPreferenceManager()).