Я пытаюсь написать тестовый пример, чтобы проверить класс, который записывает в Shared Preferences. Я использую Android Studio v1.5.
В хорошем старом затмении при использовании AndroidTestCase
на устройство был развернут второй файл apk, и тесты могут запускаться с использованием контекста инструментария, поэтому вы можете запускать тесты с использованием общих настроек инструментария apk без изменения основного apk существующих файлов общих предпочтений.
Я потратил все утро, пытаясь понять, как получить ненулевой контекст в тестах Android Studio. Очевидно, модульные тесты, сделанные для eclipse, несовместимы с платформой тестирования Android Studio, так как вызов getContext()
возвращает null.
Я думал, что нашел ответ в этом вопросе:
Получить контекст тестового проекта в тестовом примере Android junit
Все изменилось со временем, поскольку старые версии Android Studio не имели полной поддержки тестирования. Так много ответов - это просто хаки. По-видимому теперь вместо расширения InstrumentationTestCase
или AndroidTestCase
вы должны написать свои тесты следующим образом:
@RunWith(AndroidJUnit4.class)
public class MyTest {
@Test
public void testFoo(){
Context instrumentationContext = InstrumentationRegistry.getContext();
Context mainProjectContext = InstrumentationRegistry.getTargetContext();
}
}
Итак, теперь у меня есть не нулевой контекст инструментария, а метод getSharedPreferences
возвращает экземпляр, который, похоже, работает, но на самом деле нет файл настроек.
Если я это сделаю:
context = InstrumentationRegistry.getContext();
Затем редактор SharedPreferences записывает и фиксирует правильно, и исключение не генерируется. При ближайшем рассмотрении я вижу, что редактор пытается записать в этот файл:
data/data/<package>.test/shared_prefs/PREFS_FILE_NAME.xml
Но файл никогда не создается и не записывается.
Однако используя это:
context = InstrumentationRegistry.getTargetContext();
редактор работает правильно, и настройки записываются в этот файл:
/data/data/<package>/shared_prefs/PREFS_FILE_NAME.xml
Предпочтения создаются в частном режиме:
SharedPreferences sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
Насколько я знаю, после запуска теста на устройство не было загружено тестовое приложение. Это может объяснить, почему файл не был написан с использованием контекста инструментария. Возможно ли, что этот контекст является фальшивым контекстом, который терпит неудачу?
И если это так, , как я могу получить контекст REAL инструментария, чтобы я мог писать настройки без изменения основных настроек проекта?