AndroidのUnit Instrumented Testingについて読んだばかりで、SharedPreferencesHelperクラスなしでSharedPreferencesHelperクラスを here
私のコードは:
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;
}}
SharedPreferencesに他のクラスを作成せずにモックすることは可能ですか?
したがって、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();
}
_
次の例は、共有設定などのモックContextオブジェクトを使用する単体テストを作成する方法を示しています。
@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
}
}
モックフレームワークのインポートで問題が発生した場合は、app/build.gradle
ファイル。
https://developer.Android.com/training/testing/unit-testing/local-unit-tests#setup
すべてのデータをメモリに保存して、デバイスとして実際の共有プリフレンスを使用する場合は、以下のコードに従ってください。
このGistからMockSharedPreference.Javaファイルを取得します 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);
}