如何解决Android Room迁移测试:主键位置不一致会导致不必要的测试失败
Android上的Room具有一种机制,您可以通过该机制将数据库模式导出为JSON,然后根据单元测试套件中的导出模式验证数据库迁移。我在具有多个主键的表上遇到了一个问题,其中在运行迁移后,主键的位置都为1。但是,模式导出的V1和V2具有以相同顺序列出的主键。另外,导出到JSON的表架构包含一个用于索引的空列表([]
),而内存测试数据库是使用索引的空值创建的。
我很好奇这是否是Room中的错误,或者我是否可能滥用测试框架。给定迁移中的唯一变化是添加了一个全新的,不相关的表。这是我的测试代码:
@RunWith(RobolectricTestRunner::class)
class MigrationTest {
@Rule @JvmField
val helper: MigrationTestHelper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),ApplicationDatabase::class.java.canonicalName,FrameworkSQLiteOpenHelperFactory()
)
@Test
@Throws(IOException::class)
fun `Test migration from 1 to 2`() {
helper.createDatabase(TEST_DB,1).apply {
close()
}
helper.runMigrationsAndValidate(TEST_DB,2,true,MIGRATION_1_2)
}
companion object {
const val TEST_DB = "migration-test"
}
}
运行此测试时,出现以下错误:
java.lang.IllegalStateException: Migration didn't properly handle: Foo
Expected: TableInfo{name='Foo',columns={bar=Column{name='bar',type='INTEGER',affinity='3',notNull=true,primaryKeyPosition=1,defaultValue='null'},baz=Column{name='baz',type='TEXT',primaryKeyPosition=2,defaultValue='null'}},foreignKeys=[],indices=[]}
found: TableInfo{name='Foo',indices=null}
这两种情况下的JSON模式导出片段均相同。
1.json:
"tableName": "Foo","createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`bar` INTEGER NOT NULL,`baz` INTEGER NOT NULL,PRIMARY KEY(`bar`,`baz`))",
2.json:
"tableName": "Foo",
解决方法
我遇到了同样的问题。我已经通过更新 robolectric 解决了这个问题:从 4.3 到 4.5.1。
见:https://github.com/robolectric/robolectric/issues/4209
已在 robolectric 4.5 版本中推送此问题的补丁
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。