Доступ к ресурсам в проекте тестирования Android

Я setup проект испытания android испытания junit. Он использует два проекта eclipse «Приложение» и «ApplicationTest», где мои тесты находятся в проекте «ApplicationTest». В одном из моих тестов мне нужно получить доступ к файлу, это отлично работает, если я поместил файл на SD-карту и натолкнул на него объект File. Однако я хотел бы получить доступ к файлу в качестве ресурса, но это, похоже, не работает. Это то, что я сделал:

  • Сохраненный файл в ApplicationTest/res/raw/myfile.xml
  • Попытка получить его с помощью: InputStream is = getContext().getResources().openRawResource(R.raw.myfile);

Но это дает мне это исключение:

 Android.content.res.Resources $ NotFoundException: Файл Hello World, HelloAndroidActivity!  Из ресурса ID # 0x7f040000
 На android.content.res.Resources.openRawResource (Resources.java:823)
 На android.content.res.Resources.openRawResource (Resources.java:799)
 At com.quizzer.test.QuestionHandlerTests.testImportQuestions (Tests.java:182)
 В java.lang.reflect.Method.invokeNative (собственный метод)
 На android.test.AndroidTestRunner.runTest (AndroidTestRunner.java:169)
 В android.test.AndroidTestRunner.runTest (AndroidTestRunner.java:154)
 На android.test.InstrumentationTestRunner.onStart (InstrumentationTestRunner.java:529)
 At android.app.Инструментация $ InstrumentationThread.run (Instrumentation.java:1448)
 Вызвано: java.io.FileNotFoundException: Hello World, HelloAndroidActivity!
 At android.content.res.AssetManager.openNonAssetNative (собственный метод)
 At android.content.res.AssetManager.openNonAsset (AssetManager.java:406)
 На android.content.res.Resources.openRawResource (Resources.java:820)
 ... еще 14

Мой тестовый класс расширяет AndroidTestCase, поэтому здесь возникает контекст.

Обновить:

Поэтому проблема заключается в том, что во время компиляции используются ресурсы в тестовом проекте, но во время выполнения используются ресурсы основного проекта. Я еще не уверен, как это исправить. Поэтому в настоящее время он работает только в том случае, если я поставлю тот же исходный ресурс как в тестовом проекте, так и в главном проекте, который, конечно, довольно глуп.

Я бы предложил расширить ActivityTestCase вместо AndroidTestCase . Вы можете получить доступ к ресурсам тестовых проектов через

getInstrumentation().getContext().getResources().openRawResource(R.raw.your_res) .

Пример тестового примера:

 public class Test extends ActivityTestCase { public void testFoo() { // .. test project environment Context testContext = getInstrumentation().getContext(); Resources testRes = testContext.getResources(); InputStream ts = testRes.openRawResource(R.raw.your_res); assertNotNull(testRes); } } 

А затем в методах тестирования используйте getInstrumentation().getTargetContext() где вы использовали getContext() в своем расширении AndroidTestCase .

Я получил тестовый пример следующим образом:

 class MyTest extends InstrumentationTestCase { void setUp() { InputStream is = getInstrumentation().getContext().getAssets() .open("test_image.bmp"); ... } } 

И файл test_image.bmp сохраняется в каталоге ресурсов, что разумно, если вы намереваетесь использовать этот актив для некоторой связанной с тестированием работы – и это не является частью ресурсов ui. Этот метод используется в другом контексте: https://stackoverflow.com/a/4570206/1577626

Начиная с Android Gradle Plugin версии 1.1 вы не должны использовать Instrumentation для загрузки файлового ресурса.

Я написал здесь, как это сделать с модулем тестирования POJO.