Доступ к ресурсам в проекте тестирования Android
У меня установлен проект тестирования 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: 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, так что откуда приходит контекст.
Update:
Таким образом, проблема заключается в том, что во время компиляции используются ресурсы в тестовом проекте, но во время выполнения используются ресурсы основного проекта. Я еще не уверен, как это исправить. Поэтому в настоящее время он работает только в том случае, если я помещаю тот же исходный ресурс как в тестовый проект, так и в основной проект, который, конечно, довольно глупый.
Ответы
Ответ 1
Я предлагаю расширить 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
.
Ответ 2
Я получил тестовый пример следующим образом:
class MyTest extends InstrumentationTestCase {
void setUp() {
InputStream is = getInstrumentation().getContext().getAssets()
.open("test_image.bmp");
...
}
}
И файл test_image.bmp сохраняется в каталоге ресурсов, что разумно, если вы намерены использовать этот актив для некоторой связанной с тестированием работы - и ее не является частью ресурсов ui. Этот метод используется в другом контексте: fooobar.com/questions/150728/...
Ответ 3
Так как Android Gradle Plugin
версия 1.1, вы не должны использовать Instrumentation
для загрузки ресурса файла.
Я написал здесь, как это сделать с POJO unit test case.
Ответ 4
С помощью инструментов сборки 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")
}
}
}