Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 尝试使用Mockito模拟SharedReference_Android_Unit Testing_Mockito_Sharedpreferences - Fatal编程技术网

Android 尝试使用Mockito模拟SharedReference

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

我正在尝试使用Mockito测试一个设置管理器,它通过
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
),因此更容易为测试覆盖率配置工具

shadow
SharedReference
也是沙盒,因此它不会干扰设备上的实际
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的文档吗。