Как издеваться над PreferenceManager в Android? - PullRequest
17 голосов
/ 26 июля 2010

Я написал класс, который использует 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();
}

и соответствующий, который загружает настройки.

Ответы [ 2 ]

5 голосов
/ 07 марта 2013

Не похоже, что вам действительно нужен фиктивный экземпляр PreferenceManager (который в основном используется в PreferenceFragment или PreferenceActivity).

Возможно, вы захотите либо:

  1. Насмешка SharedPreferences, в этом случае вы можете просто издеваться Context#getSharedPreferences (которая в любом случае вызывается PreferenceManager#getDefaultSharedPreferences).Вам, вероятно, также придется сделать макет SharedPreferences.Editor, если настройки отредактированы, как указано выше.Вы говорите, что уже знаете, как имитировать контекст, так что это должно быть довольно просто.

  2. Чтобы использовать фактические предпочтения в среде.Это проще всего, и не обязательно плохая идея.Убедитесь, что он очищен должным образом, чтобы ваши тесты не мешали друг другу (или, в зависимости от среды тестирования, не влияли на ручное использование приложения).

Если вы действительно делаете хотите смоделировать PreferenceManager экземпляр (например, вы получаете PreferenceFragment или PreferenceActivity), вы можете сделать это абсолютно точно.вы можете сгенерировать макет PreferenceManager и SharedPreferences, используя Mockito (или другую библиотеку насмешек), если у вас есть возможность предоставить его к своему коду везде, где вы его обычно получаете (в не тестовом коде это обычноот getPreferenceManager()).

3 голосов
/ 06 февраля 2016

Вы можете использовать специализированный контекст для общих предпочтений.RenamingDelegatingContext делегирует все в контекст.Когда мы получаем доступ к SharedPreference из Context, мы используем getSharedPreferences(String name, int mode).

Здесь, расширяя RenamingDelegatingContext, мы переопределяем getSharedPreferences и притворяем параметр name с помощью test 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);
    }
}

Установите этот SpecialisedMockContext для своего тестового контекста приложения.setContext(specialisedMockContext) и createApplication().

...