【发布时间】:2017-03-12 08:36:21
【问题描述】:
我刚刚为我的 CRUD 实现创建了单元测试,我遇到了这个奇怪的问题。当测试一个一个运行时,它们都通过了。但是当我想运行整个套件时,它们会因错误而失败
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方法。它解决了问题吗? -
是的,最后我尝试将prepare移动到
@BeforeClass并清理数据库而不是在每次测试之前删除它。 -
那么,它确实解决了问题,对吧?
标签: android sqlite android-sqlite