5

Android JUnitテストを作成していて、テストフィクスチャファイル(SQLiteデータベースファイル)をコピー/リセットしたいのですが、メインアプリケーション内にいる場合は、ファイルをアセットディレクトリに配置して使用するだけで済みます。getResources().getAssets().open(sourceFile)

ActivityInstrumentationTestCase2ただし、このAPIはクラスから使用できないようです。

テスト用PCからファイルをコピーする簡単な方法はありますか、それともデバイスにテストフィクスチャの新しいコピーを保持して一時ファイルにコピーする必要がありますか?

ありがとう!

4

2 に答える 2

6

テストアプリケーションとメインアプリケーションのリソースは、インストルメンテーションテストケースで別々にアクセスできます。テストプロジェクト自体のres/rawまたはassetsフォルダーにあるリソースにアクセスする場合は、次を使用できます。

getInstrumentation().getContext().getResources()

テスト対象のアプリケーション(「ターゲット」アプリケーション)のリソースにアクセスするには、次を使用します。

getInstrumentation().getTargetContext().getResources()

ただし、アセットフォルダ内のファイルは変更できないことに注意してください。

getResources().getAssets().open(sourceFile)

InputStreamを返します。ファイルを変更する方法はありません。これは、アセットがAPK内に圧縮されて保存されており、実際にはまったく書き込みできないためです。

テストするアクティビティが使用するファイルへのパスを変更する場合は、 RenamingDelegatingContextを指定してActivityUnitTestCaseおよびsetActivityContext()を使用する必要があります。これにより、ディレクトリプレフィックスを指定することにより、コンテキスト内のファイルおよびデータベースアクセスを新しいディレクトリにリダイレクトできます。より複雑なコンストラクターを使用してほとんどの操作のターゲットコンテキストをラップすることもできますが、ファイル操作にはテストアプリケーションのコンテキストを使用するため、アクティビティはプライマリアプリケーションではなくテストアプリケーションに保存されているファイルにアクセスしますが、プライマリアプリケーション。

于 2010-10-06T23:03:54.813 に答える
3

これを実現するために(あまり洗練されていない方法で)行ったことは、テストフィクスチャをデバイス(またはエミュレートされたデバイス)にコピーすることです。「cleantestdatabase.db」という名前を付けました。次に、テストコードで、それを「testdatabase.db」にコピーします。これにより、テストで変更できますが、既知の状態にリセットできます。コードは次のとおりです。

copyFile("cleantestdatabase.db", "testdatabase.db");

private void copyFile(String source, String dest) throws IOException{
    String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath() + getActivity().getString(R.string.default_dir);
    File newDir = new File(rootPath);
    boolean result = newDir.mkdir();
    if(result == false){
        Log.e("Error", "result false");
    }

    InputStream in = new FileInputStream(rootPath + source);    
    File outFile = new File(rootPath + dest);
    if(outFile.exists()) {
        outFile.delete();
    }
    outFile.createNewFile();

    OutputStream out = new FileOutputStream(outFile);
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}
于 2010-10-16T05:03:21.720 に答える