2012-03-17 10 views
43

Appena iniziato a utilizzare Robolectric e sembra essere praticamente ciò di cui ho bisogno. Tuttavia, ho colpito un po 'di un blocco stradale per quanto riguarda l'uso di SharedPreferences.Fornire dati di test per SharedPreferences per Robolectric

Ho due casi test

  1. attività si aspetta un nuovo sharedPreferences/vuoti

  2. Attività aspetta sharedPreferences con alcuni dati in esso già

Per Test Case 1, il i test stanno passando come previsto, quindi tutto bene :)

Tuttavia, per il Test Case 2 non riesco a trovare un buon modo per fornire a Robolectric dati falsi, quindi l'Activity è in grado di accedere a questi dati falsi.

Sembra un caso d'uso molto comune, ma non riesco a capire come farlo!

risposta

54

Abbiamo scoperto come - sembra così ovvio ora!

Per coloro che sono interessati, è sufficiente ottenere le condivisioniPreferenze e compilare i dati richiesti.

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

Se avete uno SharedPreferences personalizzati, si dovrebbe essere in grado di fare questo (non ho davvero provato correttamente, ma dovrebbe funzionare anche)

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

Spero che questo qualcuno ha aiutato :)

+1

+1, questo mi ha aiutato un sacco! (il secondo funziona perfettamente). Lo sto usando per evitare di avviare compiti asincroni in modalità test impostando un metodo boolean "is test mode" sui prefs condivisi. – Jimmy

+0

suggerimento: nel codice in prova che chiama getSharedPreferences, assicurati di utilizzare il contesto dell'applicazione, altrimenti non funzionerà. –

+1

@Jimmy preferirei farlo usando i campi di configurazione custom build: http://michiganlabs.com/string-constants-generated-gradle-build-configurations – martyglaubitz

15

La risposta accettata che ho votato è ovviamente giusta. Le cose sono cambiate un po 'se si utilizza Robolectric 3

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

È quindi possibile aggiungere una preferenza come al solito

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

Robolectric soluzione 3.1 ISTANTANEA che funziona per me ... e possono funzionare per voi

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

io uso questo frammento di codice solo per testare il wifi