android sharedpreferences mockito

android - Cómo burlarse de un SharedPreferences utilizando Mockito



(2)

El siguiente ejemplo muestra cómo puede crear una prueba unitaria que utiliza un objeto de contexto simulado, como una preferencia compartida.

@RunWith(MockitoJUnitRunner.class) public class MProfileTest { @Mock Context mockContext; @Mock SharedPreferences mockPrefs; @Mock SharedPreferences.Editor mockEditor; @Before public void before() throws Exception { Mockito.when(mockContext.getSharedPreferences(anyString(), anyInt())).thenReturn(mockPrefs); Mockito.when(mockContext.getSharedPreferences(anyString(), anyInt()).edit()).thenReturn(mockEditor); Mockito.when(mockPrefs.getString("YOUR_KEY", null)).thenReturn("YOUR_VALUE"); } @Test public void anyTest() { // Any shared preference you can call // Assert.assertTrue(); String val = _mockPrefs.getString("YOUR_KEY", null); // It returns YOUR_VALUE } }

Si tiene algún problema al importar el marco de simulacro, asegúrese de haber agregado las dependencias en el archivo app/build.gradle .

https://developer.android.com/training/testing/unit-testing/local-unit-tests#setup

Si desea usar la preferencia real compartida como su dispositivo almacenando todos los datos en la memoria, siga el código a continuación.

Obtenga el archivo MockSharedPreference.java de este Gist https://gist.github.com/aslamanver/f74a2b3d450fda251d47a0d38b44edb7

@Mock Context mockContext; MockSharedPreference mockPrefs; MockSharedPreference.Editor mockPrefsEditor; @Before public void before() { mockPrefs = new MockSharedPreference(); mockPrefsEditor = mockPrefs.edit(); Mockito.when(mockContext.getSharedPreferences(anyString(), anyInt())).thenReturn(mockPrefs); }

Acabo de leer acerca de Unit Instrumented Testing en Android y me pregunto cómo puedo simular una SharedPreferences sin ninguna clase SharedPreferencesHelper como here

Mi código es:

public class Auth { private static SharedPreferences loggedUserData = null; public static String getValidToken(Context context) { initLoggedUserPreferences(context); String token = loggedUserData.getString(Constants.USER_TOKEN,null); return token; } public static String getLoggedUser(Context context) { initLoggedUserPreferences(context); String user = loggedUserData.getString(Constants.LOGGED_USERNAME,null); return user; } public static void setUserCredentials(Context context, String username, String token) { initLoggedUserPreferences(context); loggedUserData.edit().putString(Constants.LOGGED_USERNAME, username).commit(); loggedUserData.edit().putString(Constants.USER_TOKEN,token).commit(); } public static HashMap<String, String> setHeaders(String username, String password) { HashMap<String, String> headers = new HashMap<String, String>(); String auth = username + ":" + password; String encoding = Base64.encodeToString(auth.getBytes(), Base64.DEFAULT); headers.put("Authorization", "Basic " + encoding); return headers; } public static void deleteToken(Context context) { initLoggedUserPreferences(context); loggedUserData.edit().remove(Constants.LOGGED_USERNAME).commit(); loggedUserData.edit().remove(Constants.USER_TOKEN).commit(); } public static HashMap<String, String> setHeadersWithToken(String token) { HashMap<String, String> headers = new HashMap<String, String>(); headers.put("Authorization","Token "+token); return headers; } private static SharedPreferences initLoggedUserPreferences(Context context) { if(loggedUserData == null) loggedUserData = context.getSharedPreferences(Constants.LOGGED_USER_PREFERENCES,0); return loggedUserData; }}

¿Es posible simular las preferencias compartidas sin crear otra clase en él?


Entonces, porque SharedPreferences proviene de su context , es fácil:

final SharedPreferences sharedPrefs = Mockito.mock(SharedPreferences.class); final Context context = Mockito.mock(Context.class); Mockito.when(context.getSharedPreferences(anyString(), anyInt()).thenReturn(sharedPrefs); // no use context

por ejemplo, para getValidToken(Context context) , la prueba podría ser:

@Before public void before() throws Exception { this.sharedPrefs = Mockito.mock(SharedPreferences.class); this.context = Mockito.mock(Context.class); Mockito.when(context.getSharedPreferences(anyString(), anyInt())).thenReturn(sharedPrefs); } @Test public void testGetValidToken() throws Exception { Mockito.when(sharedPrefs.getString(anyString(), anyString())).thenReturn("foobar"); assertEquals("foobar", Auth.getValidToken(context)); // maybe add some verify(); }