Подтвердить что ты не робот

Как высмеять 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();
}

и соответствует, что загружает предпочтения.

4b9b3361

Ответ 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().