2016-01-30 14 views
11

का उपयोग कर एक SharedPreferences उपहास करने के लिए मैं सिर्फ एंड्रॉयड में यूनिट Instrumented परीक्षण के बारे में पढ़ा है और मुझे आश्चर्य है कि कैसे मैं की तरह hereकैसे Mockito

मेरे कोड इस पर कोई SharedPreferencesHelper वर्ग के बिना एक SharedPreferences नकली कर सकते हैं:

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

क्या अन्य कक्षाओं के बिना साझा किए गए साझाकरण को मॉक करना संभव है?

उत्तर

34

तो, क्योंकि SharedPreferences अपने context से आता है, यह आसान है:

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 
उदाहरण के लिए

, getValidToken(Context context) के लिए, परीक्षण हो सकता है:

@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

ठीक है, धन्यवाद। 'सार्वजनिक स्थैतिक शून्य सेट यूज़र क्रेडेंशियल्स (संदर्भ संदर्भ, स्ट्रिंग उपयोगकर्ता नाम, स्ट्रिंग टोकन)' परीक्षण के बारे में कैसे? मैं 'testGetValidToken()' से पहले उपयोगकर्ता प्रमाण-पत्र सेट करना चाहता हूं, मुझे लगता है कि मुझे 'SharedPreferences.Editor' के लिए नकली की आवश्यकता है, लेकिन अगर मैं उस मॉक द्वारा कुछ कुंजी सहेजता हूं तो यह 'SharedPreferences' mock' द्वारा उपलब्ध होगा? – adamura88

+1

जब मैं 'संपादन' कहलाता हूं तो मैं एक 'संपादक' नकली वापस कर दूंगा। "SharePreferences मॉक द्वारा उपलब्ध होगा?" नहीं, एक नकली एक गूंगा वस्तु है –

+0

आपके कोड में वाक्यविन्यास त्रुटियां हैं। –

संबंधित मुद्दे