2016-01-30 17 views
11

Ho appena letto su Unit Instrumented Test in Android e mi chiedo come posso prendere in giro uno SharedPreferences senza alcuna classe SharedPreferencesHelper su di esso come hereCome prendere in giro uno SharedPreferences utilizzando Mockito

il mio codice è:

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

È possibile simulare SharedPreferences senza creare altre classi su di esso?

risposta

34

Quindi, perché SharedPreferences viene dal vostro context, è facile:

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 

per esempio, per getValidToken(Context context), il test potrebbe essere:

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

Ok, grazie. Che ne dite di 'public static void setUserCredentials (Contesto contesto, String username, String token)' test? Vorrei impostare le credenziali dell'utente prima di 'testGetValidToken()' Suppongo di aver bisogno di un mock per 'SharedPreferences.Editor' ma se salvo qualche chiave da quel simulacro sarà disponibile per il simulatore di' SharedPreferences'? – adamura88

+1

Mi piacerebbe restituire un simulatore di 'Editor' quando viene chiamato' edit'. "sarà disponibile da SharedPreferences mock?" no, un finto è un oggetto stupido –

+0

Il tuo codice ha errori di sintassi. –

Problemi correlati