2012-03-17 6 views
43

J'ai juste commencé à utiliser Robolectric et il semble que ce soit à peu près ce dont j'ai besoin. Cependant, j'ai rencontré quelques difficultés en ce qui concerne l'utilisation de SharedPreferences.Fournir des données de test pour SharedPreferences pour Robolectric

J'ai deux cas tests

  1. Activité attend un nouveau/sharedPreferences vide

  2. Activité prévoit sharedPreferences avec quelques données déjà

Pour Test Case 1, la les tests passent comme prévu, donc tout va bien :)

Cependant, pour le cas de test 2, je n'arrive pas à trouver une façon sympa de fournir à Robolectric certaines fausses données, donc l'activité est capable d'accéder à ces fausses données.

Cela ressemble à un cas d'utilisation très commun, mais je n'arrive pas à comprendre comment le faire!

Répondre

54

Découvert comment - semble si évident maintenant!

Pour ceux qui sont intéressés, il vous suffit d'obtenir les sharedPreferences et de les remplir avec les données requises.

SharedPreferences sharedPreferences = ShadowPreferenceManager.getDefaultSharedPreferences(Robolectric.application.getApplicationContext()); 
sharedPreferences.edit().putString("testId", "12345").commit(); 

Si vous avez un SharedPreferences personnalisés, vous devriez être en mesure de le faire (n'ont pas vraiment testé correctement, mais devrait également fonctionner)

SharedPreferences sharedPreferences = Robolectric.application.getSharedPreferences("you_custom_pref_name", Context.MODE_PRIVATE); 
sharedPreferences.edit().putString("testId", "12345").commit(); 

Hope this quelqu'un a aidé :)

+1

+1, ce qui m'a beaucoup aidé! (le second fonctionne parfaitement). J'utilise ceci pour éviter de lancer des tâches asynchrones en mode test en définissant un booléen "is test mode" sur les préférences partagées. – Jimmy

+0

Astuce: dans votre code sous test qui appelle getSharedPreferences, assurez-vous d'utiliser le contexte de l'application, sinon cela ne fonctionnera pas. –

+1

@Jimmy Je préfèrerais accomplir cela en utilisant des champs de configuration de construction personnalisés voir: http://michiganlabs.com/string-constants-generated-gradle-build-configurations – martyglaubitz

15

La réponse acceptée que j'ai votée est bonne, bien sûr. Les choses ont changé légèrement si vous utilisez Robolectric 3

SharedPreferences sharedPreferences = 
    RuntimeEnvironment.application.getSharedPreferences(
     "you_custom_pref_name", Context.MODE_PRIVATE); 

Vous pouvez ensuite ajouter une préférence comme d'habitude

sharedPreferences.edit().putBoolean(
    activity.getString(R.string.pref_somepref), true).commit(); 
5

Robolectric 3.1 solution SNAPSHOT qui fonctionne pour moi ... et peut travailler pour vous

Context context = RuntimeEnvironment.application.getApplicationContext(); 
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
    sharedPreferences.edit().putBoolean("useOnlyOnWifi", false).commit(); 

J'utilise ce bout de code pour tester uniquement sur wifi

Questions connexes