2016-10-29 2 views
1

방금 ​​CRUD 구현을위한 단위 테스트를 만들었는데 이상한 문제가 있습니다. 테스트가 하나씩 실행되면 모두 통과합니다. 나는 전체 제품군을 실행하고자 할 때, 그들은 오류안드로이드 단위 테스트 - 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) 

실패 여기에 DAO 구현은 항상 sqliteOpenHelper.getWritableDatabase()으로 쓰기 가능한 데이터베이스를 열고 코드 그런데

@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 

입니다.

+0

테스트 사이에 언제든지 데이터베이스를 닫고 있습니까? –

+1

현재'@ Before' 메소드를'@ BeforeClass' 메소드로 변경하십시오. 문제가 해결 되었습니까? – Vasiliy

+0

예, 결국 준비를'@ BeforeClass'로 옮기고 각 테스트 전에 데이터베이스를 삭제하는 대신 데이터베이스를 정리했습니다. – user219882

답변

1

사실 DbManager와 DaoMaster는 싱글 톤입니다 (기본 데이터베이스와 비슷합니다). 각 테스트 전에 @Before의 코드가 호출되어 클래스에있는 것들을 처리해야합니다. 한 번 시작되었습니다.

@Before 주석을 @BeforeClass으로 변경하면 초기화를 한 번만 수행 할 수 있습니다.

+0

글쎄, 그건 문제가 아니야. 문제는'@ Before'에서 데이터베이스를 삭제하고 매번 실행하면 테스트가 매우 빠르며 실제로 쓰여질 필요가있는 'hot journal'이 있다는 것입니다. 그러나 기본적으로 Java 연결은 읽기 전용으로 작성되며 해당 연결로 저널을 작성할 수 없습니다. – user219882

+0

@ user219882, 나는 당신이 잘못 생각한 것 같습니다. '@ Before'에서 데이터베이스를 삭제할 수 있지만, 다시 제대로 초기화해야합니다. 귀하의 경우에 문제가 'DbManager.registerHelper()'에 대한 호출이 제대로 초기화를하지 않았다는 사실이었습니다. 어떤 경우이 답이 문제를 해결 했으므로 수락하는 것이 좋습니다. – Vasiliy

관련 문제