Предоставление тестовых данных для SharedPreferences для Robolectric

Только начал использовать Robolectric, и кажется, что это то, что мне нужно. Однако я столкнулся с небольшим препятствием в отношении использования SharedPreferences.

У меня есть два тестовых примера

  1. Активность ожидает новые/пустые общие настройки

  2. Activity ожидает, что sharedPreferences уже содержит некоторые данные.

Для Test Case 1 тесты проходят, как и ожидалось, так что все хорошо :)

Однако для тестового примера 2 я не могу найти хороший способ предоставить Robolectric некоторые поддельные данные, поэтому Activity может получить доступ к этим поддельным данным.

Это похоже на очень распространенный вариант использования, но я не могу понять, как это сделать!


person pyko    schedule 17.03.2012    source источник


Ответы (4)


Узнал как - теперь кажется таким очевидным!

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

SharedPreferences sharedPreferences = ShadowPreferenceManager.getDefaultSharedPreferences(Robolectric.application.getApplicationContext());
sharedPreferences.edit().putString("testId", "12345").commit();

Если у вас есть пользовательские SharedPreferences, вы сможете это сделать (на самом деле не тестировались должным образом, но также должны работать)

SharedPreferences sharedPreferences = Robolectric.application.getSharedPreferences("you_custom_pref_name", Context.MODE_PRIVATE);
sharedPreferences.edit().putString("testId", "12345").commit();

Надеюсь, это помогло кому-то :)

person pyko    schedule 18.03.2012
comment
+1, это мне очень помогло! (второй работает идеально). Я использую это, чтобы не запускать асинхронные задачи в тестовом режиме, устанавливая логическое значение тестового режима в общих настройках. - person Jimmy; 23.05.2012
comment
совет: в тестируемом коде, который вызывает getSharedPreferences, убедитесь, что вы используете контекст приложения, иначе это не сработает. - person Andy Dennie; 17.10.2014
comment
@ Джимми, я бы предпочел сделать это с помощью настраиваемых полей конфигурации сборки, см.: michiganlabs. ком/ - person martyglaubitz; 10.07.2015
comment
Я думаю, это должно быть PreferenceManager.getDefaultSharedPreferences(RuntimeEnvironment.application) - person sargas; 03.04.2017

Принятый ответ, за который я проголосовал, конечно, правильный. Все немного изменилось, если вы используете Robolectric 3.

 SharedPreferences sharedPreferences =
     RuntimeEnvironment.application.getSharedPreferences(
         "you_custom_pref_name", Context.MODE_PRIVATE);

Затем вы можете добавить предпочтение, как обычно

 sharedPreferences.edit().putBoolean(
    activity.getString(R.string.pref_somepref), true).commit();
person e4c5    schedule 07.11.2015
comment
Я получаю сообщение об ошибке RuntimeEnvironment, которое не может разрешить - person ; 13.06.2018

Решение Robolectric 3.1 SNAPSHOT, которое работает у меня... и может работать у вас

    Context context = RuntimeEnvironment.application.getApplicationContext();
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
    sharedPreferences.edit().putBoolean("useOnlyOnWifi", false).commit();

Я использую этот фрагмент кода только для тестирования Wi-Fi.

person Evan Parsons    schedule 07.06.2016

robolectric:4.0.2 использовать val context = ApplicationProvider.getApplicationContext<YourApplication>() PreferenceManager.getDefaultSharedPreferences(context)

person shuabing    schedule 03.01.2019