Предоставление тестовых данных для SharedPreferences для Robolectric - PullRequest
47 голосов
/ 17 марта 2012

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

У меня есть два теста

  1. Активность ожидает новые / пустые sharedPreferences

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

В тестовом примере 1 тесты проходят, как и ожидалось, поэтому все хорошо:)

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

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

Ответы [ 4 ]

57 голосов
/ 18 марта 2012

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

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

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();

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

18 голосов
/ 07 ноября 2015

Принятый ответ, за который я проголосовал, конечно же, прав.Ситуация немного изменилась, если вы используете 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();
8 голосов
/ 07 июня 2016

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

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

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

1 голос
/ 03 января 2019

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

...