Intereting Posts
Как вернуть requestCode из дочерней активности в родительскую активность по умолчанию Как использовать общие стили пользовательского интерфейса в Android? Дождитесь завершения задачи Как получить цвета по умолчанию на Android Регистр вещательного приемника в манифесте против активности Android: как получить строку в определенной локали БЕЗ изменения текущей локали Пробелы, не работающие при использовании API автозаполнения Google Адресов Аппаратное декодирование видео на Android с использованием GStreamer Как вставлять видео Youtube в приложение для Android Cordova Google Play Store меняет данные реферера на «com.android.chrome»? Eclipse не имеет java doc для отображения информации о классе и методах. Как их прикрепить? + андроид Не отображаются экран заставки для телефона / ионного приложения Автоматизировать импорт проектов Java (Android) в рабочее пространство Eclipse через командную строку Написать на stdout в JNI Android? Без <android / log.h> Как удалить мягкие кнопки / меню в андроид мороженое сэндвич?

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 или должен использовать что-то другое?

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

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

Вы можете исправить проблему с помощью 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);