私は現在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必要に応じて、さらにコードを追加できます。これは、最初は必要だと思っていたものです。