eclipse 访问 android 测试项目中的资源

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9249751/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 17:42:32  来源:igfitidea点击:

Accessing resources in an android test project

androideclipseunit-testing

提问by Zitrax

I have setup an android test project that runs junit tests. It's using two eclipse projects "Application" and "ApplicationTest" where my tests are in the "ApplicationTest" project. In one of my tests I need to access a file, this works fine if I put the file on the sdcard and point a File object to it. However I would like to access the file as a resource, but that does not seem to work. This is what I did:

我已经设置了一个运行 junit 测试的 android 测试项目。它使用两个 Eclipse 项目“Application”和“ApplicationTest”,其中我的测试位于“ApplicationTest”项目中。在我的一个测试中,我需要访问一个文件,如果我将文件放在 sdcard 上并将 File 对象指向它,这可以正常工作。但是,我想将该文件作为资源访问,但这似乎不起作用。这就是我所做的:

  • Saved the file in ApplicationTest/res/raw/myfile.xml
  • Trying to get it using: InputStream is = getContext().getResources().openRawResource(R.raw.myfile);
  • 将文件保存在 ApplicationTest/res/raw/myfile.xml
  • 尝试使用: InputStream is = getContext().getResources().openRawResource(R.raw.myfile);

But that gives me this exception:

但这给了我这个例外:

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

My test class extends AndroidTestCase so that's where the context comes from.

我的测试类扩展了 AndroidTestCase,所以这就是上下文的来源。

Update:

更新:

So the problem seem to be that during compilation the resources in the test project are used, but at runtime the resources in the main project are used. I am yet unsure how to fix that. So currently it only works if I put the same raw resource both in the test project and the main project which of course is quite stupid.

所以问题似乎是在编译期间使用了测试项目中的资源,但在运行时使用了主项目中的资源。我还不确定如何解决这个问题。所以目前它只有在我把相同的原始资源放在测试项目和主项目中时才有效,这当然很愚蠢。

回答by plesatejvlk

I would suggest extending ActivityTestCaseinstead of AndroidTestCase. You can than access test project resources via

我建议扩展ActivityTestCase而不是AndroidTestCase. 您可以通过以下方式访问测试项目资源

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

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

Dummy test case example:

虚拟测试用例示例:

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

And then in test methods use getInstrumentation().getTargetContext()wherever you used getContext()in your AndroidTestCaseextension.

然后在测试方法中使用getInstrumentation().getTargetContext()getContext()AndroidTestCase扩展中使用的任何地方。

回答by vpathak

I derived the test case as follows:

我得出的测试用例如下:

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

And the file test_image.bmp is saved in assets directory, which is reasonable if you intend to use the asset for some testing related work - and its not part of ui resources. The technique is used in another context here: https://stackoverflow.com/a/4570206/1577626

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

回答by Calin

With build tools 3.0.0 you can use ActivityTestRule

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

回答by klimat

Since Android Gradle Pluginversion 1.1 you haven't to use Instrumentationto load file resource.

Android Gradle Plugin1.1 版开始,您不再使用Instrumentation加载文件资源。

I wrote herehow to do it with POJO unit testcase.

我在这里如何使用 POJO单元测试用例来做到这一点。