Я недавно начал писать свой действительно первый проект для Android с использованием Android Studio 3.1.2 и SDK 19.
В настоящее время я пишу модульные тесты для своих компонентов и использую Mockito для моделирования объектов, зависящих от API Android.Когда я написал тест для моего SessionHandler
, вспомогательного класса, который управляет данными, хранящимися в SharedPreferences
, я столкнулся с проблемой, что, если я хочу проверить, если, например, mockEdit.remove("my_key")
был успешным, я не знал, как издеваться над поведением в частности.
Вот как я готовлю свои насмешливые вещи:
private final Context mockedContext = Mockito.mock(Context.class);
private final SharedPreferences mockedPrefs = Mockito.mock(SharedPreferences.class);
private final SharedPreferences.Editor mockEdit = Mockito.mock(SharedPreferences.Editor.class);
private boolean shouldReturnTestUUID = true;
@Before
public void prepareMocks() {
Mockito.when(mockedContext.getSharedPreferences(anyString(), anyInt()).thenReturn(mockedPrefs);
Mockito.when(mockedPrefs.getString("my_key", null)).thenReturn(shouldReturnTestUUID ? "test_UUID" : null);
//this is the one, I got stuck at
Mockito.when(mockEdit.remove("my_key")).thenReturn(mockEdit.putString("my_key", null));
}
Метод, который я на самом деле проверяю:
public synchronized static void removeAppInstanceID(Context context) {
if (appInstanceID != null) {
SharedPreferences sharedPrefs = context.getSharedPreferences("session", Context.MODE_PRIVATE);
sharedPrefs.edit().remove("my_key").apply();
}
}
Метод теста:
@Test
public void canRemoveUUID() {
shouldReturnTestUUID = false;
SessionHandler.removeAppInstanceID(mockedContext);
assertNull(mockedPreferences.getString("my_key", null));
shouldReturnTestUUID = true;
}
Если я пытаюсь запустить этот тест, я получаю исключение UnfinishedStubbingException, ссылающееся на строку, где я хочу смоделировать mockEdit.remove("my_key")
.Похоже, заглушка не знает, что делать с mockEdit.putString("my_key", null);
.
Итак, мой вопрос, как смоделировать этот метод, чтобы я мог вызвать mockedPrefs.getString("my_key")
и проверить, является ли возвращаемое значение null
?Спасибо вперед.