时间:2010-07-26 17:58:56

标签: android unit-testing mocking android-preferences

2 个答案:

答案 0 :(得分:5)

看起来您实际上并不想要PreferenceManager的模拟实例(主要用于PreferenceFragmentPreferenceActivity)。

你可能想要:

  1. 模拟SharedPreferences,在这种情况下,您可以模拟Context#getSharedPreferences(无论如何都由PreferenceManager#getDefaultSharedPreferences调用)。如上所述,如果编辑首选项,您可能还必须制作模拟SharedPreferences.Editor。你说你已经知道如何模拟上下文,所以这应该是相当简单的。

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

  3. 如果你真的想要模仿PreferenceManager实例(就像你进入PreferenceFragmentPreferenceActivity那样),你绝对可以这样做。

    由于它不是最终的,你可以使用Mockito(或其他模拟库)生成模拟PreferenceManagerSharedPreferences,只要你有办法将它提供给你的代码,无论你通常在哪里得到一个(在非测试代码中,这通常来自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()