Насмешливый SharedPreferences.Editor.putString () - PullRequest
0 голосов
/ 15 октября 2018

Я недавно начал писать свой действительно первый проект для 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?Спасибо вперед.

1 Ответ

0 голосов
/ 15 октября 2018

У вас есть два варианта:

  • Макет SharedPreferences с использованием Robolectric как здесь: https://stackoverflow.com/a/9755286/1150795. Robolectric - это общий инструмент для модульного тестирования приложений Android и Mockingобъекты из Android SDK
  • Вы можете добавить дополнительный слой абстракции и скрыть сохранение SharedPreferences за интерфейсом, который можно смоделировать с помощью Mockito
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...