答案 0 :(得分:5)
看起来您实际上并不想要PreferenceManager
的模拟实例(主要用于PreferenceFragment
或PreferenceActivity
)。
你可能想要:
模拟SharedPreferences
,在这种情况下,您可以模拟Context#getSharedPreferences
(无论如何都由PreferenceManager#getDefaultSharedPreferences
调用)。如上所述,如果编辑首选项,您可能还必须制作模拟SharedPreferences.Editor
。你说你已经知道如何模拟上下文,所以这应该是相当简单的。
使用环境中的实际首选项。这是最简单的,也不一定是个坏主意。确保它已正确清理,以便您的测试不会相互干扰(或者,根据您的测试环境,不会受到手动使用应用程序的影响)。
如果你真的做想要模仿PreferenceManager
实例(就像你进入PreferenceFragment
或PreferenceActivity
那样),你绝对可以这样做。
由于它不是最终的,你可以使用Mockito(或其他模拟库)生成模拟PreferenceManager
和SharedPreferences
,只要你有办法将它提供给你的代码,无论你通常在哪里得到一个(在非测试代码中,这通常来自getPreferenceManager()
)。
答案 1 :(得分:3)
您可以使用专门的上下文来共享首选项。 RenamingDelegatingContext
将所有内容委托给Context。当我们从Context
访问SharedPreference时,我们使用getSharedPreferences(String name, int mode)
。
这里通过扩展RenamingDelegatingContext
我们覆盖getSharedPreferences并使用test PREFIX
假装name参数,因此当测试运行时,它将写入与主应用程序不同的首选项文件。
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()
。