2010-07-26 11 views
17

Ho scritto una classe che utilizza Context, una libreria di terze parti e SharedPreferences da PreferenceManager.Come simulare PreferenceManager in Android?

È possibile simulare Context, la libreria di terze parti può essere derisa utilizzando un framework di derisione, ma cosa fare con PreferenceManager?

Ho due metodi:

public void saveString(ThirdPartyObject obj) { 
    SharedPreferences appPreferences = 
     PreferenceManager.getDefaultSharedPreferences(mContext); 
    SharedPreferences.Editor editor = appPreferences.edit(); 
    editor.putString(mContext.getString(
     R.string.preferences_string_name), obj.getString()); 
    editor.commit(); 
} 

e corrispondenti, che preferenze carichi.

+10

C'è qualche comportamento particolare in "PreferenceManager" che è necessario prendere in giro? In caso contrario, il test del codice di preferenza funziona bene con un 'AndroidTestCase'. –

+1

È un peccato non poter accettare un commento, ma quello che hai scritto mi soddisfa. – pixel

risposta

5

Non sembra che si desideri effettivamente un'istanza di simulazione di PreferenceManager (che viene utilizzata principalmente in un PreferenceFragment o PreferenceActivity).

probabilmente avrete bisogno sia:

  1. Un finto SharedPreferences, nel qual caso si può solo prendere in giro Context#getSharedPreferences (che è chiamato da PreferenceManager#getDefaultSharedPreferences comunque). Probabilmente dovrai anche fare un finto SharedPreferences.Editor se le preferenze sono modificate, come sopra. Dici di sapere già come deridere il contesto, quindi questo dovrebbe essere abbastanza semplice.

  2. Per utilizzare le preferenze effettive nell'ambiente. Questo è più semplice e non è necessariamente una cattiva idea. Assicurati che sia pulito correttamente in modo che i test non interferiscano tra loro (o, a seconda dell'ambiente di test, non siano influenzati dall'uso manuale dell'app).

Se davvero non vuole deridere PreferenceManager esempio (come quello che si ottiene in PreferenceFragment o PreferenceActivity), si può assolutamente farlo.

Dal momento che è non-finale, è possibile generare un finto PreferenceManager e SharedPreferences utilizzando Mockito (o un'altra libreria beffardo) fino a quando si dispone di un modo per fornire al vostro codice ovunque si solito ottenere uno (in non-test codice, questo normalmente viene dallo getPreferenceManager()).

+1

'Context # getSharedPreferences' richiede di passare un nome di file. –

2

È possibile utilizzare il contesto specializzato per le preferenze condivise. RenamingDelegatingContext delega tutto a un contesto. Quando accediamo a SharedPreference da Context, utilizziamo getSharedPreferences(String name, int mode).

Qui, estendendo RenamingDelegatingContext, sovrascriviamo getSharedPreferences e simuliamo il parametro name con il test PREFIX, quindi quando esegue il test, esso scriverà sul file delle preferenze che è diverso dall'applicazione principale.

public class SpecializedMockContext extends RenamingDelegatingContext { 
    public static final String PREFIX = "test."; 

    public SpecializedMockContext(Context context) { 
     super(context, PREFIX); 
    } 

    @Override 
    public SharedPreferences getSharedPreferences(String name, int mode) { 
     return super.getSharedPreferences(PREFIX + name, mode); 
    } 
} 

Impostare questo SpecializedMockContext sul contesto dell'applicazione di test. setContext(specialisedMockContext) e createApplication().

+0

Non sono sicuro del motivo per cui questa risposta non sta ottenendo alcun upvotes; Ho aggiunto il mio. Certamente documenta ciò che ho fatto in passato e ha funzionato bene per me.Se hai una stalla limitata di dispositivi reali, come fa la maggior parte di noi, allora non è importante inquinare una serie di preferenze di lavoro per il codice di prova. –

+0

Dove si chiama 'setContext (specialisedMockContext)'? –