我正在尝试使用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
?
答案 0 :(得分:3)
Robolectric是此类集成测试的选项。
Robolectric提供称为"阴影"的测试双打。常见的Android类,例如SQLiteDatabase
,SharedPreferences
和test
。您编写的测试在IDE中的androidTest
中运行(在模拟器或测试设备上不是SharedPreference
),因此更容易配置测试覆盖率的工具。
阴影SharedPreferences
也是沙盒,因此它不会干扰设备上的实际/ninja/<color>
。
答案 1 :(得分:2)
将此转换为AndroidTest并使用InstrumentationRegistry.getTargetContext()
来获取上下文,这样您就可以使用该类而无需模拟它