尝试使用Mockito模拟SharedPreferences
我试图使用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
?
Robolectric是这种集成测试的选项。
Robolectric提供常见Android类的“阴影”测试双打,如Context
,SQLiteDatabase
和SharedPreferences
。您编写的测试在您的IDE中运行test
(而不是在模拟器或测试设备上的androidTest
),因此配置测试覆盖率的工具更容易。
影子SharedPreference
也是沙盒,所以它不会干扰设备上的实际SharedPreferences
。
将它转换为一个AndroidTest并使用InstrumentationRegistry.getTargetContext()
,以获得上下文,这样你可以使用类没有嘲笑它
但是这样我无法承担代码覆盖率:当我通过选择“运行代码覆盖率”运行测试时,出现此错误:“运行SettingsInstrumented的错误...:找不到运行程序SettingsInstrumented ...” 。 android.defaultConfig.testInstrumentationRunner在build.gradle文件中的值是“android.support.test.runner.AndroidJUnitRunner” –
@NicolaGiancecchi检查这个http://blog.wittchen.biz.pl/test-coverage-report-for -roid应用程序/希望它可以帮助 –
我会试一试!谢谢:) –
robolectrichas非常糟糕的文档。你可以帮我使用robolectric的任何文档。 –