3

私は現在AndroidAPIをテストしています。そのために、事前に作成したデータベースをコピーするアプリケーションを開発し、そのアプリケーション(いくつかのAndroidクラスを呼び出す)をテストしています。誰かが私にRobolectricを使用してAndroidソースのカバレッジを取得するように指示しましたが、これによりいくつかの問題が発生しました。私のアプリケーションは、テストと同様にそれがなくても問題なく動作しますが、データベースのコピーでエラーが発生しています。テストを実行するたびに、catchによってデータベースのコピーでエラーが発生し、そのcatchを削除するとAssertionFailureErrorが発生します。

assertTrue(activity.accessAdapter() != null);
assertTrue(activity.accessAdapter().accessHelper().checkDatabase()); // Here

これは、データベースがコピーされないことと関係があると思います。コードにあるトライキャッチを元に戻すと、データベースをコピーするときにそれらがオフになります。

これが私のSQLiteOpenHelperのコード、または少なくともデータベースのコピーで呼び出されるコードです。

public void createDatabase() throws IOException
{
    this.getReadableDatabase();
    this.close();
    try {
        copyDatabase();
        Log.e(TAG, "Database created.");
    } catch (IOException e) {
        throw new Error("Error copying database.");
    }
}

private void copyDatabase() throws IOException {
    InputStream input = ((ShadowContextWrapper) shadowContext).getAssets().open(DATABASE_NAME);
    String outFileName = DATABASE_PATH + DATABASE_NAME;
    OutputStream output = new FileOutputStream(outFileName);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = input.read(buffer)) > 0) output.write(buffer, 0, length);
    output.flush();
    output.close();
    input.close();
}

問題はコンテキストに関係しているのではないかと思ったので、ShadowContextを作成しましたが、それも実際には役に立ちませんでした。他にもエラーがありますが、それらはSQLiteOpenHelperのcreateDatabase()まで相互に呼び出すメソッドにすぎません。

Robolectricを使用してこのデータベースをコピーする方法を知っている人はいますか?アプリケーションのアセットに保存しましたが、エミュレーターがなければ、これは無意味です。ありがとうございました。

PS必要に応じて、さらにコードを追加できます。これは、最初は必要だと思っていたものです。

4

0 に答える 0