尝试使用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保持不变的currentSharedPreferences不保留数据。如何在测试时将数据保存到SharedPreferences

Robolectric是这种集成测试的选项。

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

影子SharedPreference也是沙盒,所以它不会干扰设备上的实际SharedPreferences

+0

我会试一试!谢谢:) –

+0

robolectrichas非常糟糕的文档。你可以帮我使用robolectric的任何文档。 –

将它转换为一个AndroidTest并使用InstrumentationRegistry.getTargetContext(),以获得上下文,这样你可以使用类没有嘲笑它

+0

但是这样我无法承担代码覆盖率:当我通过选择“运行代码覆盖率”运行测试时,出现此错误:“运行SettingsInstrumented的错误...:找不到运行程序SettingsInstrumented ...” 。 android.defaultConfig.testInstrumentationRunner在build.gradle文件中的值是“android.support.test.runner.AndroidJUnitRunner” –

+0

@NicolaGiancecchi检查这个http://blog.wittchen.biz.pl/test-coverage-report-for -roid应用程序/希望它可以帮助 –