Android InstrumentationTestCase getFilesDir () возвращает null

Я использую InstrumentationTestCase для тестирования тестового компонента моего приложения.

Компонент сохраняет данные во внутреннем хранилище и использует Context::fileList(); Для извлечения сохраненных файлов.

Я испытываю следующую проблему: использование этого метода в приложении (на устройстве) работает отлично. Но когда я пытаюсь (Android-) Unit-Test (также на устройстве) с использованием InstrumentationTestCase я получаю fileList() NullPointerException внутри fileList() . Я выкопал в источник Android и выяснил, что getFilesDir() (см. Источник здесь) возвращает null и вызывает эту ошибку.

Код для воспроизведения следующий:

 public class MyTestCase extends InstrumentationTestCase { public void testExample() throws Exception { assertNotNull(getInstrumentation().getContext().getFilesDir()); // Fails } } 

Мои вопросы: Является ли это поведение? Что я могу сделать, чтобы обойти эту проблему? Я правильно использую InstrumentationTestCase или должен использовать что-то другое?

Я нашел этот вопрос, но не уверен, что это касается той же проблемы, что и у меня.

Solutions Collecting From Web of "Android InstrumentationTestCase getFilesDir () возвращает null"

Я думаю, что вы правы, сохраняя ваши тестовые данные отдельно от тестируемого приложения.

Вы можете исправить проблему с помощью Null , создав каталог files для приложения Instrumentation , выполнив следующие команды:

 adb shell cd /data/data/<package_id_of_instrumentation_app> mkdir files 

Вы можете сделать это выше только на эмуляторе или в корневом устройстве.

Тогда тест с вашего вопроса не подведет. Я сделал это, а также загрузил файл с именем tst.txt в files dir, все тесты были успешными:

 assertNotNull(getInstrumentation().getContext().getFilesDir()); assertNotNull(getInstrumentation().getContext().openFileInput("tst.txt")); assertNotNull(getInstrumentation().getContext().openFileOutput("out.txt", Context.MODE_PRIVATE)); 

Но я считаю, что более удобным способом предоставить данные для тестирования проекта является использование assets тестового проекта, где вы можете просто сохранить некоторые файлы и открыть их:

 assertNotNull(getInstrumentation().getContext().getAssets().open("asset.txt")); 

Или если вы хотите сохранить некоторые результаты тестов в файл, вы можете использовать ExternalStorage :

 File extStorage = Environment.getExternalStorageDirectory(); assertNotNull(extStorage);