Перемешивание по умолчанию SharedPreferences - PullRequest
0 голосов
/ 17 ноября 2018

Итак, у меня есть класс, который принимает Context через конструктор и извлекает из него значение по умолчанию SharedPreferences, используя:

PreferenceManager.getDefaultSharedPreferences(context)

Я тестирую этот класс и в моем модулеtest Я написал следующий код для извлечения поддельного экземпляра SharedPreferences при вызове getSharedPreferences(String, int):

Context context = mock(Context.class);
SharedPreferences sharedPreferences = mock(SharedPreferences.class);

when(context.getSharedPreferences(anyString(), anyInt()))
            .thenReturn(sharedPreferences);
when(sharedPreferences.getString(anyString(), nullable(String.class)))
            .thenReturn(tokenManager.getToken());

Когда я запускаю тест для этого класса, он заканчивается объектом nullвместо моего издевательского экземпляра SharedPreferences.Тем не менее, если я получу экземпляр SharedPreferences с помощью context.getSharedPreferences("stubbed", 123), я получу свой поддельный код SharedPreferences.

Так почему PreferenceManager.getDefaultSharedPreferences(context) возвращает экземпляр null при непосредственном вызове getSharedPreferences на моем макете Context возвращает мой макетированный SharedPreferences экземпляр?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Так что вам нужно смоделировать статический вызов на PreferenceManager.getDefaultSharedPreferences(context).Это невозможно в настоящее время с mockito, все еще обсуждается соответствующая проблема .

Одно решение показано в принятом ответе на этот вопрос ,Вы можете проверить PowerMock или JMockit в качестве альтернативы

0 голосов
/ 20 ноября 2018

Основываясь на этом документе (https://developer.android.com/training/testing/unit-testing/local-unit-tests) и построчно отлаживая код, я пришел к выводу о том, почему это происходит, потому что код Android, используемый для модульных тестов в gradle, на самом деле является просто оболочкой, которая возвращает значения при каждом вызове метода, поэтому, естественно, это заставляет меня предположить, что код для PreferenceManager.getDefaultSharedPreferences(), который используется в моих модульных тестах, более или менее return null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...