You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hilt依赖注入测试Worker类时实例创建失败求助

解决HiltWorker测试实例创建失败问题

问题描述

测试带有@HiltWorker注解的MyWorker类时,创建实例抛出错误:

java.lang.IllegalStateException: Could not create an instance of ListenableWorker

相关代码如下:

Worker类代码

@HiltWorker
class MyWorker @AssistedInject constructor(
    @Assisted private val context: Context,
    @Assisted parameters: WorkerParameters,
    private val repository: IMyRepository // 接口类型依赖
) : CoroutineWorker(context, parameters) {
    ////
}

测试代码

@HiltAndroidTest
class WorkerTest {

    @get:Rule
    val hiltRule = HiltAndroidRule(this)
    private lateinit var appContext: Context

    @Before
    fun setUp() {
        appContext = ApplicationProvider.getApplicationContext()
        hiltRule.inject()
    }

    @Test
    fun testMyWorker() {
        val worker = TestListenableWorkerBuilder<DecryptionWorker>(
            context = appContext,
        ).build() // 错误触发点
    }
}

测试仓库实现类

@Singleton
class TestMyRepositoryImpl @Inject constructor(): IMyRepository {
    ////
}

测试模块代码

@Module
@TestInstallIn(
    components = [SingletonComponent::class],
    replaces = [CoreModule::class]
)
abstract class TestCoreModule {
    @Binds
    abstract fun provideMyRepository(myRepositoryImpl: TestMyRepositoryImpl): IMyRepository
}

不确定测试仓库绑定及模块替换是否正确,需解决实例创建失败问题。


修复步骤

1. 修正Worker类名错误

测试代码中泛型使用了DecryptionWorker,但实际要测试的是MyWorker,直接导致Hilt无法定位目标类:

@Test
fun testMyWorker() {
    val worker = TestListenableWorkerBuilder<MyWorker>(appContext).build()
}

2. 使用Hilt专用测试Builder创建实例

带@HiltWorker注解的Worker必须用HiltTestListenableWorkerBuilder构建,才能让Hilt处理依赖注入:

@Test
fun testMyWorker() {
    val worker = HiltTestListenableWorkerBuilder<MyWorker>(appContext).build()
}

3. 确保Context通过Hilt注入

不要直接用ApplicationProvider获取Context,改为通过Hilt注入,保证上下文已被Hilt初始化:

@HiltAndroidTest
class WorkerTest {

    @get:Rule
    val hiltRule = HiltAndroidRule(this)
    
    @Inject
    lateinit var appContext: Context

    @Before
    fun setUp() {
        hiltRule.inject()
    }

    // ...测试代码
}

4. 验证测试模块替换逻辑

  • 确认CoreModule(被替换的原模块)的@InstallIn组件是SingletonComponent::class,与TestCoreModule的@TestInstallIn组件一致。
  • 确保CoreModule中确实是通过@Binds或@Provides提供IMyRepository的绑定,这样TestCoreModule才能正确替换它。

5. 补充必要的测试依赖

确保gradle中添加了WorkManager的Hilt测试库:

androidTestImplementation "androidx.hilt:hilt-work-testing:1.1.0"

内容的提问来源于stack exchange,提问作者segoSambel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:25:31