Доступ к ресурсам в тестовом проекте Android - PullRequest
19 голосов
/ 12 февраля 2012

Я настроил тестовый проект Android, который запускает тесты Junit. Он использует два проекта Eclipse «Application» и «ApplicationTest», где мои тесты находятся в проекте «ApplicationTest». В одном из моих тестов мне нужен доступ к файлу, это прекрасно работает, если я помещаю файл на SD-карту и указываю на него объект File. Однако я хотел бы получить доступ к файлу в качестве ресурса, но это не похоже на работу. Вот что я сделал:

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

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

android.content.res.Resources$NotFoundException: File Hello World, HelloAndroidActivity! from drawable resource ID #0x7f040000
at android.content.res.Resources.openRawResource(Resources.java:823)
at android.content.res.Resources.openRawResource(Resources.java:799)
at com.quizzer.test.QuestionHandlerTests.testImportQuestions(Tests.java:182)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1448)
Caused by: java.io.FileNotFoundException: Hello World, HelloAndroidActivity!
at android.content.res.AssetManager.openNonAssetNative(Native Method)
at android.content.res.AssetManager.openNonAsset(AssetManager.java:406)
at android.content.res.Resources.openRawResource(Resources.java:820)
... 14 more

Мой тестовый класс расширяет AndroidTestCase, так что вот откуда берется контекст.

Обновление:

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

Ответы [ 4 ]

24 голосов
/ 22 марта 2012

Я бы предложил расширить <a href="http://developer.android.com/reference/android/test/ActivityTestCase.html" rel="noreferrer">ActivityTestCase</a> вместо 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 расширении.

3 голосов
/ 24 августа 2013

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

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

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

0 голосов
/ 11 октября 2017

С инструментами сборки 3.0.0 вы можете использовать ActivityTestRule

@RunWith(AndroidJUnit4::class)
@SmallTest
class MainActivityTest {
    @Rule
    @JvmField
    var mainActivityRule = ActivityTestRule(MainActivity::class.java)

    private val baseUrl: String
        get() {
            return mainActivityRule.activity.getString(R.string.base_url)
        }

    @Test
    fun launchingWithMovieIntent() {
            assert.that(baseUrl, equalTo("someValue")
        }
    }
}
0 голосов
/ 08 апреля 2015

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

Я написал здесь как это сделать с помощью POJO модульного теста кейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...