2017-08-25 3 views
1

J'essaie d'utiliser Mockito pour tester un gestionnaire de paramètres qui enregistre des données via SharedPreferences.Essayer de se moquer des SharedPreferences à l'aide de Mockito

Depuis SharedPreferences utilise Context, j'ai besoin d'utiliser des classes fictives.

Ceci est mon paramètres classe gestionnaire:

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(); 
    } 
} 

Tel est le cas de test je l'ai écrit:

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); 

Le problème est quand je mis le drapeau setNotificationsEnabled, le newValue reste le même de current : SharedPreferences ne conserve pas de données. Comment puis-je sauvegarder les données en SharedPreferences pendant le test?

Répondre

3

Robolectric est une option pour ce type de test d'intégration. Robolectric propose des doubles de test appelés «ombres» des classes Android courantes telles que Context, SQLiteDatabase et SharedPreferences. Les tests que vous écrivez s'exécutent dans test dans votre EDI (et non sur androidTest sur un émulateur ou un périphérique de test), il est donc plus facile de configurer les outils pour la couverture de test.

L'ombre SharedPreference est également un bac à sable afin de ne pas interférer avec le SharedPreferences réel sur un périphérique.

+0

Je vais essayer! Merci :) –

+0

robolectrichas très mauvais docs. pouvez-vous m'aider avec l'un des docs pour l'utilisation de robolectric. –

2

convertir en un AndroidTest et utiliser InstrumentationRegistry.getTargetContext() pour obtenir un contexte, de cette façon, vous pouvez utiliser la classe sans se moquant il

+0

Mais de cette façon, je ne pouvais pas me permettre une couverture de code: lorsque j'exécute des tests en sélectionnant "Exécuter avec couverture de code", j'obtiens cette erreur: "Erreur lors de l'exécution de SettingsInstrumented ...: Impossible de trouver runner pour SettingsInstrumented ..." . La valeur de android.defaultConfig.testInstrumentationRunner dans le fichier build.gradle est "android.support.test.runner.AndroidJUnitRunner" –

+0

@NicolaGiancecchi vérifier ce http://blog.wittchen.biz.pl/test-coverage-report-for -android-application/j'espère que ça aide –