访问androidtesting项目中的资源

我已经安装了一个运行junittesting的androidtesting项目。 它使用两个eclipse项目“Application”和“ApplicationTest”,我的testing位于“ApplicationTest”项目中。 在我的一个testing中,我需要访问一个文件,这工作正常,如果我把文件放在SD卡上,并指向一个文件对象。 不过,我想访问该文件作为资源,但似乎并没有工作。 这就是我所做的:

  • 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)
在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)
在android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1448)
引起:java.io.FileNotFoundException:Hello World,HelloAndroidActivity!
在android.content.res.AssetManager.openNonAssetNative(本地方法)
在android.content.res.AssetManager.openNonAsset(AssetManager.java:406)
在android.content.res.Resources.openRawResource(Resources.java:820)
 ... 14更多

我的testing类扩展了AndroidTestCase,这是上下文的来源。

更新:

所以问题似乎是,在编译过程中使用了testing项目中的资源,但在运行时使用了主项目中的资源。 我还不确定如何解决这个问题。 所以目前只有当我在testing项目和主要项目中都放入相同的原始资源的时候,这当然是相当愚蠢的。

我会build议扩展ActivityTestCase而不是AndroidTestCase 。 您可以通过访问testing项目资源

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

虚拟testing案例:

 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); } } 

然后在testing方法中使用getInstrumentation().getTargetContext()无论您在AndroidTestCase扩展中使用了getContext()

testing用例如下:

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

test_image.bmp文件保存在资产目录中,如果您打算将资产用于某些testing相关的工作 – 而且它不是ui资源的一部分,则这是合理的。 该技术在另一个上下文中使用: https : //stackoverflow.com/a/4570206/1577626

由于Android Gradle Plugin版本1.1,您不必使用Instrumentation来加载文件资源。

我在这里写了如何用POJO unit testing用例做到这一点。

使用构build工具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") } } }