Как высмеять PreferenceManager в Android?
Я написал класс, который использует Context
, стороннюю библиотеку и SharedPreferences
из PreferenceManager
.
Возможно фальсифицировать Context
, третья партийная библиотека может быть изделена с использованием некоторой издевательской структуры, но что делать с PreferenceManager
?
У меня есть два метода:
public void saveString(ThirdPartyObject obj) {
SharedPreferences appPreferences =
PreferenceManager.getDefaultSharedPreferences(mContext);
SharedPreferences.Editor editor = appPreferences.edit();
editor.putString(mContext.getString(
R.string.preferences_string_name), obj.getString());
editor.commit();
}
и соответствует, что загружает предпочтения.
Ответы
Ответ 1
Не похоже, что вы действительно хотите использовать mock-экземпляр PreferenceManager
(который в основном используется в PreferenceFragment
или PreferenceActivity
).
Вероятно, вы хотите:
-
Макет SharedPreferences
, и в этом случае вы можете просто высмеять Context#getSharedPreferences
(который все равно вызывается PreferenceManager#getDefaultSharedPreferences
). Вероятно, вам также придется сделать mock SharedPreferences.Editor
, если настройки будут изменены, как указано выше. Вы говорите, что уже знаете, как издеваться над контекстом, поэтому это должно быть довольно просто.
-
Использовать фактические настройки в среде. Это проще всего, и не обязательно плохая идея. Удостоверьтесь, что он очищен должным образом, чтобы ваши тесты не мешали друг другу (или, в зависимости от вашей тестовой среды, не влияли на использование приложения вручную).
Если вы действительно хотите издеваться над экземпляром PreferenceManager
(например, вы попадаете в PreferenceFragment
или PreferenceActivity
), вы можете это сделать абсолютно.
Поскольку он не является окончательным, вы можете генерировать макет PreferenceManager
и SharedPreferences
с использованием Mockito (или другой насмешливой библиотеки), если у вас есть способ предоставить его вашему коду, где бы вы обычно его не получали (в не-тестовый код, это обычно происходит от getPreferenceManager()
).
Ответ 2
Вы можете использовать специализированный контекст для общих предпочтений. RenamingDelegatingContext
делегирует все в контекст. Когда мы получаем доступ к SharedPreference из Context
, мы используем getSharedPreferences(String name, int mode)
.
Здесь, расширяя RenamingDelegatingContext
, мы переопределяем getSharedPreferences и притворяемся параметром имени с тестом PREFIX
, поэтому при запуске теста он будет записывать в файл предпочтений, который отличается от основного приложения.
public class SpecializedMockContext extends RenamingDelegatingContext {
public static final String PREFIX = "test.";
public SpecializedMockContext(Context context) {
super(context, PREFIX);
}
@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
return super.getSharedPreferences(PREFIX + name, mode);
}
}
Установите этот SpecializedMockContext в тестовый контекст приложения. setContext(specialisedMockContext)
и createApplication()
.