2016-10-29 10 views
1

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()として書き込み可能なデータベースを開きます。

+0

あなたはテストの間にいつでもデータベースを閉じますか? –

+1

現在の '@ Before'メソッドを' @ BeforeClass'メソッドに変更してみてください。それは問題を解決するか? – Vasiliy

+0

最後に、準備を '@ BeforeClass'に移して、各テストの前に削除するのではなく、データベースをきれいにしました。 – user219882

答えて

1

これは、DbManagerとDaoMasterがシングルトンであることに関連しています(基礎データベースと同様です)。@Beforeのコードが各テストの前に呼び出されます。ただ一回始めた。

@Before注釈を@BeforeClassに変更すると、初期化を1回だけ実行できます。

+0

さて、それは問題ではありません。問題は、 '@ Before'でデータベースを削除して毎回実行すると、テストは非常に速く、実際には書き込みが必要な 'ホットジャーナル'があるということです。しかし、デフォルトでは、Java接続は読み取り専用として作成され、その接続でジャーナルを書き込むことはできません。 – user219882

+0

@ user219882、あなたは間違っていると思います。 '@ Before'でデータベースを削除することもできますが、再度正しく初期化する必要があります。あなたのケースの問題は、 'DbManager.registerHelper()'の呼び出しが正しく初期化されなかったという事実だと思います。いずれにせよ、この回答があなたの問題を解決したので、それを受け入れることを検討してください) – Vasiliy

関連する問題