访问android测试项目中的资源

时间:2012-02-12 14:58:03

标签: android eclipse unit-testing

我已经设置了一个运行junit测试的android测试项目。它正在使用两个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 个答案:

答案 0 :(得分:24)

我建议延长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

答案 1 :(得分:3)

我将测试用例推导如下:

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

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

答案 2 :(得分:0)

Android Gradle Plugin版本1.1起,您无法使用Instrumentation加载文件资源。

我写了here如何使用POJO unit test案例。

答案 3 :(得分:0)

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