Android 尝试使用Mockito模拟SharedReference
我正在尝试使用Mockito测试一个设置管理器,它通过Android 尝试使用Mockito模拟SharedReference,android,unit-testing,mockito,sharedpreferences,Android,Unit Testing,Mockito,Sharedpreferences,我正在尝试使用Mockito测试一个设置管理器,它通过SharedReferences保存数据 由于SharedReferences使用了Context,因此我需要使用模拟类 这是我的设置管理器类: public class SettingsManager implements ISettingsManager { protected SharedPreferences prefs; public SettingsManager(SharedPreferences prefs
SharedReferences
保存数据
由于SharedReferences
使用了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
保持相同:SharedReferences
不会保留数据。测试时如何将数据保存到SharedReferences
?将其转换为AndroidTest并使用InstrumentationRegistry.getTargetContext()
若要获取上下文,您可以使用该类而无需模拟它将其转换为AndroidTest并使用InstrumentationRegistry.getTargetContext()
要获取上下文,您可以通过这种方式使用类而无需模拟它是此类集成测试的一个选项
Robolectric提供了称为“阴影”的测试双重功能,用于常见Android类,如Context
、SQLiteDatabase
和SharedReferences
。您编写的测试在IDE的test
中运行(而不是在模拟器或测试设备上运行androidTest
),因此更容易为测试覆盖率配置工具
shadowSharedReference
也是沙盒,因此它不会干扰设备上的实际SharedReference
。是此类集成测试的一个选项
Robolectric提供了称为“阴影”的测试双重功能,用于常见Android类,如Context
、SQLiteDatabase
和SharedReferences
。您编写的测试在IDE的test
中运行(而不是在模拟器或测试设备上运行androidTest
),因此更容易为测试覆盖率配置工具
shadow
SharedReference
也是沙盒的,因此它不会干扰设备上的实际SharedReference
。但这样我就负担不起代码覆盖率:当我通过选择“使用代码覆盖率运行”来运行测试时,我得到以下错误:“运行SettingsInstrumented…”时出错:找不到SettingsInstrumented…”的运行程序。build.gradle文件中android.defaultConfig.TestInstrumentRunner的值为“android.support.test.runner.AndroidJUnitRunner”“@Nicolaginancecchi检查此项,希望它能有所帮助,但这样我就负担不起代码覆盖率:当我通过选择“使用代码覆盖率运行”来运行测试时,我会出现以下错误:“运行设置时出错…”:找不到用于设置的运行程序。build.gradle文件中android.defaultConfig.TestInstrumentRunner的值为“android.support.test.runner.AndroidJUnitRunner”@nicolaginancecchi检查此项,希望对您有所帮助我会尝试一下!谢谢:)Robolectric有非常糟糕的文档。你能帮我看一下使用机器人测角仪的文档吗?我试试看!谢谢:)Robolectric有非常糟糕的文档。你能帮我看一下关于使用robolectric的文档吗。