测试室作为JUnit测试而不是AndroidTest
尝试使用MigrationTestHelper类和Robolectric测试室迁移。我们希望它作为JUnit测试,因为我们的CI环境无法启动模拟器。(请不要回答针对模拟器的CI修复,CI不在我的控制范围内)我唯一的问题是测试失败,因为它找不到架构。我的身材gradle已经有这个了测试室作为JUnit测试而不是AndroidTest,android,unit-testing,android-room,Android,Unit Testing,Android Room,尝试使用MigrationTestHelper类和Robolectric测试室迁移。我们希望它作为JUnit测试,因为我们的CI环境无法启动模拟器。(请不要回答针对模拟器的CI修复,CI不在我的控制范围内)我唯一的问题是测试失败,因为它找不到架构。我的身材gradle已经有这个了 android { sourceSets { test.assets.srcDirs += files("$projectDir/schemas".toString()) and
android {
sourceSets {
test.assets.srcDirs += files("$projectDir/schemas".toString())
androidTest.assets.srcDirs += files("$projectDir/schemas".toString())
test {
java.srcDirs += "$projectDir/src/sharedTest/java"
}
testOptions {
unitTests {
includeAndroidResources = true
}
unitTests.all {
systemProperty 'robolectric.enabledSdks', '21'
}
}
}
dependencies {
// has all the proper dependencies from mockito adn robolectric to kotlin and junit.
}
这是测试代码,但在调用数据库创建时,通常只是找不到模式。json文件也在schema目录中
@RunWith(RobolectricTestRunner::class)
class Migration19To20Test {
private val migration = MyDatabase.MIGRATION_19_20
private val fromVersion = 19
private val toVersion = 20
@get:Rule
val helper: MigrationTestHelper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
MyDatabase::class.java.canonicalName,
FrameworkSQLiteOpenHelperFactory())
private val testDatabaseName = "migration-test"
@Test
fun insertsFirmwareVersionFullColumn() {
givenADatabase()
val validateDroppedTables = true
val db = helper.runMigrationsAndValidate(
testDatabaseName,
toVersion,
validateDroppedTables,
migration)
db.query("select * from ${DatabaseConstants.Table.People}").use { cursor ->
cursor.moveToFirst()
assertTrue("table should contain the ${DatabaseConstants.Column.People.NAME_FULL} column as it should have been added",
cursor.columnNames.contains(DatabaseConstants.Column.People.NAME_FULL))
}
}
private fun givenADatabase() {
// Test fails here
helper.createDatabase(testDatabaseName, fromVersion)
}
}
我通过将
MigrationTestHelper
复制到我的测试源代码并修改loadSchema方法来解决这个问题
private SchemaBundle loadSchema(Context context, int version) throws IOException {
// InputStream input = context.getAssets().open(mAssetsFolder + "/" + version + ".json");
InputStream input = new FileInputStream("./schemas/" + mAssetsFolder + "/" + version + ".json");
return SchemaBundle.deserialize(input);
}
schemas
目录在build.gradle中配置
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [
"room.schemaLocation" : "$projectDir/schemas".toString(),
"room.incremental" : "true",
"room.expandProjection": "true"]
}
}
}
}
正如您所看到的,原因是这个类在assets
目录中查找迁移,因为Google假定您将在设备上运行这些迁移。在这种情况下,您必须将它们作为android资产的一部分
使用Robolectric,它只是从一个目录中读取数据并将其放入一个流中。您找到解决方案了吗?@JPM有解决方案吗?没有,还没有解决方案,抱歉。我现在放弃了。这对我不起作用。我收到一个错误:“java.lang.IllegalArgumentException:class androidx.room.migration.bundle.FtsEntityBundle声明了多个名为robo_data的JSON字段”,您确定目标是有效的room JSON文件吗?