2012-03-17 4 views
43

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

У меня есть два теста случая

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

  2. активность ожидает sharedPreferences с некоторыми данными в нем уже

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

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

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

ответ

54

Обнаружили, как - кажется, так очевидно сейчас!

Для тех, кому это интересно, вы просто получаете 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(); 

Надеется, что это помогает кто-то :)

+1

+1, это помогло мне много! (второй работает отлично). Я использую это, чтобы избежать запуска асинхронных задач в тестовом режиме, установив логический режим «тестовый режим» на общих привилегиях. – Jimmy

+0

Совет: в тестируемом коде, вызывающем getSharedPreferences, убедитесь, что вы используете контекст приложения, иначе это не сработает. –

+1

@ Jimmy Я бы скорее выполнил это, используя настраиваемые поля конфигурации сборки: http://michiganlabs.com/string-constants-generated-gradle-build-configurations – martyglaubitz

15

Принятый ответ, который я проголосовал, является правильным, конечно. Вещи немного изменились, если вы используете 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(); 
5

Robolectric раствор 3,1 SNAPSHOT, который работает для меня ... и может работать для вас

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

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

Смежные вопросы