测试ksp生成的内部类

问题描述 投票:0回答:1

我们最近将房间从 KAPT 迁移到了 KSP。 当 kotlin 代码生成设置打开时

extensions.configure<KspExtension> {
    arg("room.generateKotlin", "true")
}

AutoMigration 类在 build/ generated/ksp 文件夹中生成为内部类。 不幸的是,这破坏了现有的单元测试,因为自动迁移实现无法访问,因为 KSP 将类生成为内部类。 我可以用

来规避这个问题
@file:Suppress("invisible_reference", "invisible_member")

文件顶部的声明。但这显然是一种黑客行为,不安全,并且可能很快就会被淘汰。

  1. 是否可以通过 Android 库模块中的 gradle 源集解决此问题?
  2. 是否可以指示 room ksp 将生成的自动迁移类设为公共或添加 @VisibleForTesting 注解?

有人找到解决这个问题的干净方法吗?

我的约定插件如下所示:


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"
android android-room internal-class ksp
1个回答
0
投票

事实证明,我们不必再在 runMigrationsAndValidate 方法中指定 AutoMigration 类了。它会自动应用于数据库,就像在真实应用程序数据库中所做的那样。

@get:Rule
    val helper: MigrationTestHelper = MigrationTestHelper(
        InstrumentationRegistry.getInstrumentation(),
        Database::class.java,
    )

...

@Test
fun testAutoMigration() {
db = helper.runMigrationsAndValidate(TEST_DB, 2, true)
// verify
}
© www.soinside.com 2019 - 2024. All rights reserved.