我们最近将房间从 KAPT 迁移到了 KSP。 当 kotlin 代码生成设置打开时
extensions.configure<KspExtension> {
arg("room.generateKotlin", "true")
}
AutoMigration 类在 build/ generated/ksp 文件夹中生成为内部类。 不幸的是,这破坏了现有的单元测试,因为自动迁移实现无法访问,因为 KSP 将类生成为内部类。 我可以用
来规避这个问题@file:Suppress("invisible_reference", "invisible_member")
文件顶部的声明。但这显然是一种黑客行为,不安全,并且可能很快就会被淘汰。
有人找到解决这个问题的干净方法吗?
我的约定插件如下所示:
class AndroidRoomKspConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
pluginManager.apply("androidx.room")
pluginManager.apply("com.google.devtools.ksp")
extensions.configure<KspExtension> {
arg("room.generateKotlin", "true")
}
extensions.configure<RoomExtension> {
// The schemas directory contains a schema file for each version of the Room database.
// This is required to enable Room auto migrations.
// See https://developer.android.com/reference/kotlin/androidx/room/AutoMigration.
schemaDirectory("$projectDir/schemas")
}
dependencies {
add("implementation", libs.findLibrary("ksp-symbol-processing").get())
add("api", libs.findBundle("room-api").get())
add(
"androidTestImplementation",
libs.findLibrary("androidx-room-testing").get()
)
add(
"testImplementation",
libs.findLibrary("androidx-room-testing").get()
)
add("ksp", libs.findLibrary("room-compiler").get())
}
}
}
}
版本:
kotlinVersion = "2.0.20"
roomVersion = "2.6.1"
kspVersion = "2.0.20-1.0.25"
事实证明,我们不必再在 runMigrationsAndValidate 方法中指定 AutoMigration 类了。它会自动应用于数据库,就像在真实应用程序数据库中所做的那样。
@get:Rule
val helper: MigrationTestHelper = MigrationTestHelper(
InstrumentationRegistry.getInstrumentation(),
Database::class.java,
)
...
@Test
fun testAutoMigration() {
db = helper.runMigrationsAndValidate(TEST_DB, 2, true)
// verify
}