尝试使用Mockito模拟SharedPreferences

时间:2017-08-25 10:21:12

标签: android unit-testing mockito sharedpreferences

我正在尝试使用Mockito来测试设置管理器,该管理器通过SharedPreferences保存数据。

由于SharedPreferences使用Context,我需要使用模拟类。

这是我的设置管理员课程:

public class SettingsManager implements ISettingsManager {

    protected SharedPreferences prefs;

    public SettingsManager(SharedPreferences prefs) {
        this.prefs = prefs;
    }

    private boolean getBooleanPreference(String key) {
        return prefs.getBoolean(key, true);
    }

    private void setBooleanPreference(boolean enabled, String key) {
        SharedPreferences.Editor editor = prefs.edit();
        editor.putBoolean(key, enabled);
        editor.commit();
    }
}

这是我写的测试案例:

Context mContext = Mockito.mock(Context.class);
SharedPreferences mSharedPreference = Mockito.mock(SharedPreferences.class);
SharedPreferences.Editor mEditor = Mockito.mock(SharedPreferences.Editor.class, Mockito.RETURNS_DEEP_STUBS);
Mockito.when(mSharedPreference.edit()).thenReturn(mEditor);
Mockito.when(mEditor.commit()).thenReturn(true);
Mockito.when(mEditor.putBoolean(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(mEditor);

SettingsManager manager = new SettingsManager(mSharedPreference);
boolean current = manager.areNotificationsEnabled();
manager.setNotificationsEnabled(!current);
boolean newValue = manager.areNotificationsEnabled();
Assert.assertTrue(newValue != current);

问题是,当我设置setNotificationsEnabled标记时,newValue仍然与current相同:SharedPreferences不会保留数据。如何在测试时将数据保存到SharedPreferences

2 个答案:

答案 0 :(得分:3)

Robolectric是此类集成测试的选项。

Robolectric提供称为"阴影"的测试双打。常见的Android类,例如SQLiteDatabaseSharedPreferencestest。您编写的测试在IDE中的androidTest中运行(在模拟器或测试设备上不是SharedPreference),因此更容易配置测试覆盖率的工具。

阴影SharedPreferences也是沙盒,因此它不会干扰设备上的实际/ninja/<color>

答案 1 :(得分:2)

将此转换为AndroidTest并使用InstrumentationRegistry.getTargetContext()来获取上下文,这样您就可以使用该类而无需模拟它