2017-08-25 119 views
1

我試圖使用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

回答

3

Robolectric是這種集成測試的選項。

Robolectric提供常見Android類的「陰影」測試雙打,如Context,SQLiteDatabaseSharedPreferences。您編寫的測試在您的IDE中運行test(而不是在模擬器或測試設備上的androidTest),因此配置測試覆蓋率的工具更容易。

影子SharedPreference也是沙盒,所以它不會干擾設備上的實際SharedPreferences

+0

我會試一試!謝謝:) –

+0

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

2

將它轉換爲一個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應用程序/希望它可以幫助 –