2010-07-26 13 views
17

He escrito una clase que está utilizando Context, una biblioteca de terceros y SharedPreferences de PreferenceManager.¿Cómo burlarse de PreferenceManager en Android?

Es posible burlarse de Context, la biblioteca de terceros se puede burlar utilizando algún marco burlón, pero ¿qué hacer con PreferenceManager?

Tengo dos métodos:

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

y correspondiente, que las cargas de preferencias.

+10

¿Hay algún comportamiento en particular en 'PreferenceManager' que necesite simular? De lo contrario, el código de preferencia de prueba funciona bien desde un 'AndroidTestCase'. –

+1

Es una pena que no pueda aceptar un comentario, pero lo que ha escrito me satisface. – pixel

Respuesta

5

No parece que realmente desee una instancia simulada de PreferenceManager (que se usa principalmente en un PreferenceFragment o PreferenceActivity).

es probable que desee, ya sea:

  1. Una maqueta SharedPreferences, en cuyo caso sólo puede burlarse Context#getSharedPreferences (que es llamada por PreferenceManager#getDefaultSharedPreferences de todos modos). Probablemente también tendrá que hacer un simulacro SharedPreferences.Editor si las preferencias se editan, como se indicó anteriormente. Usted dice que ya sabe cómo burlarse del contexto, por lo que esto debería ser bastante sencillo.

  2. Para usar las preferencias reales en el entorno. Esto es más fácil y no necesariamente una mala idea. Asegúrese de que se haya limpiado correctamente para que sus pruebas no interfieran entre sí (o, según el entorno de prueba, no se vean afectadas por el uso manual de la aplicación).

Si realmente qué quiere burlarse PreferenceManager instancia (como la que se obtiene en PreferenceFragment o PreferenceActivity), se puede hacer absolutamente así.

Puesto que es no final, se puede generar una maqueta PreferenceManager y SharedPreferences usando Mockito (u otra biblioteca de burla), siempre y cuando usted tiene una manera de proporcionar a su código donde quiera que comúnmente no conseguir uno (en la no-test código, esto normalmente viene del getPreferenceManager()).

+1

'Context # getSharedPreferences' requiere que pase un nombre de archivo. –

2

Puede usar contexto especializado para preferencias compartidas. RenamingDelegatingContext delega todo a un Contexto. Cuando accedemos a SharedPreference desde Context, usamos getSharedPreferences(String name, int mode).

Aquí ampliando RenamingDelegatingContext reemplazamos getSharedPreferences y simulamos el parámetro de nombre con la prueba PREFIX, entonces cuando la prueba se ejecuta escribirá en el archivo de preferencias que es diferente de la aplicación principal.

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

Establezca este SpecialisedMockContext en su contexto de aplicación de prueba. setContext(specialisedMockContext) y createApplication().

+0

No estoy seguro de por qué esta respuesta no está recibiendo ningún voto positivo; He agregado el mío Ciertamente documenta lo que hice en el pasado y me ha funcionado bien.Si tiene una cantidad limitada de dispositivos reales, como la mayoría de nosotros, entonces, no contaminar un conjunto de preferencias de trabajo es importante para el código de prueba. –

+0

¿Cómo se llama 'setContext (specialisedMockContext)'? –