CRUD実装の単体テストを作成しましたが、私はこの奇妙な問題があります。テストが1つずつ実行されるとき、テストはすべてパスします。しかし、私は全体のスイートを実行したい場合、彼らはエラーAndroidユニットテスト - SQLiteReadOnlyDatabaseException:読み取り専用データベース(コード1032)を書き込もうとしています
android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471)
at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1367)
at cz.pikadorama.simpleorm.DatabaseSanityTest.testDelete(DatabaseSanityTest.java:55)
ここところでコード
@Before
public void prepareDatabase() throws InstantiationException, IllegalAccessException {
Context context = InstrumentationRegistry.getTargetContext();
context.deleteDatabase(DATABASE_NAME);
DbManager.registerHelper(new TestSQLiteHelper(context), new Class<?>[]{TestEntity.class});
}
@Test
public void testDelete() {
Dao<TestEntity> dao = DaoManager.getDao(TestEntity.class);
TestEntity entity = new TestEntity();
dao.create(entity);
dao.delete(entity);
assertEquals(0, dao.findAll().size());
}
// other tests for insert, update, ... follow
だと失敗し、DAOの実装は常にsqliteOpenHelper.getWritableDatabase()
として書き込み可能なデータベースを開きます。
あなたはテストの間にいつでもデータベースを閉じますか? –
現在の '@ Before'メソッドを' @ BeforeClass'メソッドに変更してみてください。それは問題を解決するか? – Vasiliy
最後に、準備を '@ BeforeClass'に移して、各テストの前に削除するのではなく、データベースをきれいにしました。 – user219882