有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java安卓房间部分迁移测试

我正在处理的代码库(NewPipe)使用Android Room。它有一个扩展了^{}^{}、一个^{}、一个^{}。我在StreamEntity中添加了一列,并将@Database版本从3增加到4。我还从{}添加了一个{}到{}

问题是以前有a test测试从版本23的迁移。当我试图运行测试时,我得到了错误java.lang.IllegalStateException: A migration from 3 to 4 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.。我可以通过将.addMigrations(MIGRATION_3_4)添加到this line来修复此错误。但这也会运行从版本34的迁移,我想将其隔离到一个单独的测试中

实际上getMigratedDatabase()函数只在数据验证测试中需要(除了自动迁移验证之外)。通过在部分迁移的数据库上运行^{},我可以从(部分)迁移的数据库中获取数据,但我无法以StreamEntity的形式获取数据

如何测试部分迁移数据库以及访问部分迁移数据库上的StreamDAO

编辑: 我(从测试单一迁移的Android开发人员那里)了解到You cannot use DAO classes because they expect the latest schema.。我可以通过(kotlin)获取所有数据:

query("SELECT * FROM streams").run {
    DatabaseUtils.dumpCursorToString(this)
}

但是,我无法将其转换为StreamEntity以便于数据测试


共 (1) 个答案

  1. # 1 楼答案

    如果要测试只迁移了一半的数据,则必须创建匹配的(遗留)DB、dao和实体(不推荐)

    我认为您最好先阅读单独的列值,然后检查这些值,或者自己获取这些值并构造实体

    类似于以下内容(Java):

    db = helper.runMigrationsAndValidate(AppDatabase.DATABASE_NAME, 3, false, MIGRATION_2_3);
    Cursor cursor = db.query("SELECT * FROM " + TEST_DB + ";" );
    cursor.moveToFirst();
    assertEquals(expectedColumnValue, cursor.getString(cursor.getColumnIndex("columnName1" )));
    assertNull(cursor.getString(cursor.getColumnIndex("columnName2" )));
    
    

    然后为整个迁移(到v4)添加另一个测试,在那里您可以使用Dao方法直接检查StreamEntity,并确认Dao正在正确构建StreamEntity