2016-01-30 3 views
11

Ich habe gerade über Unit Instrumented Testing in Android lesen, und ich frage mich, wie ich ein SharedPreferences ohne SharedPreferencesHelper Klasse auf sie wie hereWie ein SharedPreferences verspotten Mockito mit

Mein Code spotten kann, ist:

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

Ist es möglich, SharedPreferences zu spotten, ohne andere Klassen zu erstellen?

Antwort

34

Also, weil SharedPreferences von Ihrem context kommt, ist es einfach:

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 

zum Beispiel für getValidToken(Context context), der Test sein könnte:

@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, danke. Wie wäre es mit 'öffentlichen statischen void setUserCredentials (Kontext Kontext, String Benutzername, String Token)' Test? Ich möchte Benutzer-Credentials setzen, bevor 'testGetValidToken()' Ich nehme an, dass ich Mock für 'SharedPreferences.Editor' brauchen, aber wenn ich einige Schlüssel speichern, indem das verspotten sie von' SharedPreferences' Mock verfügbar sein wird? – adamura88

+1

Ich würde einen 'Editor'-Mock zurückgeben, wenn' edit' aufgerufen wird. "wird durch SharedPreferences mock verfügbar sein?" Nein, ein Mock ist ein dummes Objekt –

+0

Ihr Code weist Syntaxfehler auf. –