8

InstrumentationTestCaseアプリケーションのコンポーネントの単体テストに使用しています。

コンポーネントはデータを内部ストレージに永続化Context::fileList();し、永続化されたファイルを取得するために使用します。

次の問題が発生します: アプリ (デバイス上) でこのメソッドを使用すると、問題なく動作します。しかし、(Android-)単体テスト(デバイス上でも)を使用してしようとすると、メソッド内InstrumentationTestCaseに取得されます。Android のソースを調べたところ、(ソースはこちら)が null を返し、このエラーが発生することがわかりました。NullPointerExceptionfileList()getFilesDir()

再現するコードは次のとおりです。

public class MyTestCase extends InstrumentationTestCase
{   
    public void testExample() throws Exception
    {
        assertNotNull(getInstrumentation().getContext().getFilesDir()); // Fails
    }
}

私の質問は次のとおりです。この動作は意図されたものですか? この問題を回避するにはどうすればよいですか? 私はInstrumentationTestCase正しいものを使用していますか、それとも別のものを使用する必要がありますか?

この質問を見つけましたが、これが私が抱えている同じ問題をカバーしているかどうかはわかりません。

4

2 に答える 2

10

テストデータをテスト済みアプリケーションとは別に保持することは正しいと思います。

次のコマンドを実行してアプリのディレクトリをNull作成することで問題を解決できますfilesInstrumentation

adb shell
cd /data/data/<package_id_of_instrumentation_app>
mkdir files

上記は、エミュレーターまたはルート化されたデバイスでのみ実行できます。

その後、質問からのテストは失敗しません。tst.txt私はそれを行い、filesdirという名前のファイルもアップロードしました.以下のすべてのテストは成功しました:

assertNotNull(getInstrumentation().getContext().getFilesDir());
assertNotNull(getInstrumentation().getContext().openFileInput("tst.txt"));
assertNotNull(getInstrumentation().getContext().openFileOutput("out.txt", Context.MODE_PRIVATE));

しかし、テスト プロジェクトにデータを提供するより便利な方法は、assetsいくつかのファイルを保存して開くことができるテスト プロジェクトを使用することだと思います。

assertNotNull(getInstrumentation().getContext().getAssets().open("asset.txt"));

または、テストの結果をファイルに保存する場合は、次を使用できますExternalStorage

File extStorage = Environment.getExternalStorageDirectory();
assertNotNull(extStorage);
于 2013-01-22T22:11:10.393 に答える