2012-02-12 10 views
17

junitテストを実行するアンドロイドテストプロジェクトをセットアップしました。私のテストが "ApplicationTest"プロジェクトにある2つのEclipseプロジェクト "Application"と "ApplicationTest"を使用しています。私のテストの1つでは、私はファイルにアクセスする必要があります。これは、ファイルをsdcardに置いて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を拡張して、コンテキストがどこから来るのかを確認します。

    更新:

    だから、問題はコンパイル時にテストプロジェクト内のリソースが使用されますが、実行時にメインプロジェクト内のリソースが使用されていることであるように見えます。私はまだそれを修正する方法が不明です。だから、私はテスト・プロジェクトとメイン・プロジェクトの両方で、同じ原始資源を入れているのは当然です。

  • +0

    そのを使用することができます3.0.0。それともちょうど私かもしれません。あなたはここで何をしようとしているのかを詳しく説明できますか?設定は明確ですが、PASSの結果とFAILの結果の例を示してください。 – Siddharth

    +0

    @Siddharth私は、リソースが私のテストに合格すると、(私はsdcardからファイルに直接アクセスするとうまくいくので)私が詳しく調べるべきか分からない。私は、アンドロイドでリソースファイルを使用する方法や、単体テストクラスからアクセスする方法について何か不足しているかもしれないと思います。 – Zitrax

    +0

    アンドロイドテストプロジェクトがサブプロジェクトの場合は、それが役に立ちますか?または依存プロジェクトですか? – Siddharth

    答えて

    23

    AndroidTestCaseの代わりにActivityTestCaseを拡張することをお勧めします。

    getInstrumentation().getContext().getResources().openRawResource(R.raw.your_res)でテストプロジェクトリソースにアクセスすることはできません。

    ダミーテストケースの例:あなたはAndroidTestCase拡張でgetContext()を使用どこ

    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()を使用しています。

    +0

    ありがとうございました。私はデータベースの作成に問題がありましたが、ここに解決策が見つかりました:http://stackoverflow.com/a/8488722/11722 – Zitrax

    +0

    それを聞いてうれしいです:) – plesatejvlk

    +1

    ありがとうございました! P.S. InstrumentationTestCaseも動作するようです。 – Y2i

    2

    次のように私はテストケースを導出:

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

    を、ファイルtest_image.bmpあなたはいくつかのテスト関連の仕事のために資産を使用する場合は合理的である資産のディレクトリに保存されている - とそのありませんuiリソースの一部。このテクニックは別のコンテキストで使用されています。https://stackoverflow.com/a/4570206/1577626

    +1

    'getContext()'を 'getTargetContext()'に変更する必要がありました – joslinm

    +0

    まだエラーが発生しています:** android.content.res.Resources $ NotFoundException:StringリソースID#0x7f06000e ** –

    0

    Android Gradle Pluginバージョン1.1以降、ファイルリソースをロードするのにInstrumentationを使用してはいけません。

    POJO unit testの場合はhereと書いてあります。ビルドツールで

    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") 
         } 
        } 
    } 
    
    関連する問題