【问题标题】:Android Room Partial Migration TestingAndroid Room 部分迁移测试
【发布时间】:2021-09-13 16:25:17
【问题描述】:

我正在处理的代码库 (NewPipe) 使用 Android Room。它有一个AppDatabase 扩展RoomDatabase (the Android Room class)、一个StreamDAO 和一个StreamEntity。我向StreamEntity 添加了一列,并将@Database 版本从3 增加到4。我还添加了一个从3 到4 的Migration。

问题是之前a test 测试了从版本2 到3 的迁移。当我尝试运行测试时,我收到错误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 来修复此错误。但这也会运行从版本 3 到 4 的迁移,我想将其隔离到单独的测试中。

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

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

编辑: 我了解(来自 Android Developers Testing Single Migrations)You cannot use DAO classes because they expect the latest schema.。我可以使用 (kotlin) 获取所有数据:

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

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

【问题讨论】:

    标签: java android kotlin android-room


    【解决方案1】:

    如果您想测试只迁移了一半的数据,则必须创建匹配的(旧版)数据库、dao 和实体(不推荐)。

    我认为您最好阅读单独的列值,然后仅检查这些值,或者获取这些值并自己构建 SteamEntity。

    类似这样的东西(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。

    【讨论】:

    • 谢谢,我只是想澄清一下没有其他选择。项目的维护者决定删除迁移测试并手动测试数据库迁移。
    • @ktstuff 啊我明白了,现在好像它已经不在你的手中了。我自己不是一个测试纯粹主义者,但在我个人看来,手动测试在这里并不可行。对于 3-4 个数据库版本,这已经非常乏味了。
    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2018-07-10
    • 2018-06-19
    相关资源
    最近更新 更多