Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测试室作为JUnit测试而不是AndroidTest_Android_Unit Testing_Android Room - Fatal编程技术网

测试室作为JUnit测试而不是AndroidTest

测试室作为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

尝试使用MigrationTestHelper类和Robolectric测试室迁移。我们希望它作为JUnit测试,因为我们的CI环境无法启动模拟器。(请不要回答针对模拟器的CI修复,CI不在我的控制范围内)我唯一的问题是测试失败,因为它找不到架构。我的身材gradle已经有这个了

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文件吗?