android - 如何在 Android 中模拟 PreferenceManager?

标签 android unit-testing mocking android-preferences

我编写了一个使用Context、第三方库和PreferenceManager 中的SharedPreferences 的类。

可以mock Context,第三方库可以用一些mocking框架来mock,但是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();
}

和相应的,加载首选项。

最佳答案

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

你可能想要:

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

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

如果你真的确实想模拟 PreferenceManager 实例(就像你在 PreferenceFragmentPreferenceActivity 中得到的那样) ,你绝对可以这样做。

由于它不是最终的,只要您有办法将其提供给您的代码通常可以在任何地方获得(在非测试代码中,这通常来自 getPreferenceManager())。

关于android - 如何在 Android 中模拟 PreferenceManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337558/

相关文章:

android - 如何在 android 中进行普通的 vanilla junit 测试?做的时候出错

android - 如何强制图表引擎停止调整图表大小?

android - Xamarin AndroidManifest.xml 与 Visual Studio 中的不同

java - Android + jfreeSVG : inheritance issues

python - 如何将 key 输入终端以进行单元测试

javascript - 使用模拟 $resource 在 AngularJS 中进行单元测试

java - Junit 和 EasyMock 理解澄清

unit-testing - 如何在单元测试中模拟 subprocess.call

javascript - 用 Sinon.js 模拟的对象不承认通过 jQuery.delegate 回调执行了它们的方法

屏幕关闭时的 Android "slows down"