启用KSP后,Android Instrumentation测试中Hilt是否仍需kaptAndroidTest?
我正在开发一个使用Hilt进行依赖注入的Android项目,近期已启用KSP(Kotlin Symbol Processing)替代KAPT(Kotlin Annotation Processing Tool),并为常规应用代码和Instrumentation测试配置了KSP。
当前Android模块build.gradle配置
plugins { alias(libs.plugins.ksp) alias(libs.plugins.hilt) } android { defaultConfig { ... } buildTypes { debug { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } release { isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildFeatures { compose = true buildConfig = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.4" } experimentalProperties["android.experimental.enableScreenshotTest"] = true packaging { resources.excludes.addAll( listOf( "META-INF/LICENSE.md", "META-INF/LICENSE-notice.md", "/META-INF/{AL2.0,LGPL2.1}" ) ) } testOptions{ unitTests{ isIncludeAndroidResources = true } } } dependencies { //Hilt implementation(libs.hilt.android.core) ksp(libs.hilt.compiler) implementation(libs.hilt.compose.viewmodel) //HiltTesting androidTestImplementation(libs.androidx.hilt.testing) kspAndroidTest(libs.hilt.compiler.test) }
libs.version.toml依赖配置
[versions] agp = "8.8.0" kotlin = "2.1.0" ... hilt = "2.51.1" ksp = "2.1.0-1.0.29" hiltViewModel = "1.2.0" [libraries] ... #Hilt hilt-compose-viewmodel = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltViewModel" } hilt-android-core = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" } .. androidx-hilt-testing = { group = "com.google.dagger",name ="hilt-android-testing",version.ref = "hilt"} hilt-compiler-test ={group= "com.google.dagger",name="hilt-android-compiler",version.ref="hilt"} [plugins] ... hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
但查阅官方文档时,发现文档中指出Instrumented测试需使用kaptAndroidTest:
dependencies { // For instrumented tests. androidTestImplementation("com.google.dagger:hilt-android-testing:2.51.1") // ...with Kotlin. kaptAndroidTest("com.google.dagger:hilt-android-compiler:2.51.1") // ...with Java. androidTestAnnotationProcessor("com.google.dagger:hilt-android-compiler:2.51.1") }
我有以下疑问:
- Hilt的Android测试注解处理器是否仍依赖KAPT,还是我的配置存在缺失导致无法完全适配KSP?
- 若必须使用KAPT,这是否是Hilt在Android测试中支持KSP的已知限制?
- 我是否需要移除KSP,改用KAPT来实现Hilt和Instrumentation测试?
解答
Hilt测试注解处理器已支持KSP,你的配置无缺失
Hilt从2.48版本开始就支持用KSP替代KAPT处理Instrumentation测试代码。你当前配置中的kspAndroidTest(libs.hilt.compiler.test)是正确的,hilt-android-compiler和主代码依赖的hilt-compiler是同一个处理器,只是针对测试场景使用kspAndroidTest配置即可,无需依赖KAPT。官方文档的示例可能未及时更新到KSP版本。无需强制使用KAPT,这不是已知限制
Hilt对KSP的支持已经覆盖了所有测试场景(包括Instrumentation测试和单元测试),不存在必须使用KAPT的限制。如果遇到编译问题,优先检查KSP与Kotlin、Hilt版本的兼容性(你的Kotlin 2.1.0搭配KSP 2.1.0-1.0.29、Hilt 2.51.1是匹配的)。不需要移除KSP,保持当前配置即可
完全可以继续使用KSP适配Hilt和Instrumentation测试,无需回退到KAPT。只要确保Hilt版本在2.48及以上,且KSP版本与Kotlin版本严格对应,就能正常生成测试所需的Hilt代码。
内容的提问来源于stack exchange,提问作者Waheed Shah

