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

基于Hilt@AssistedInject的自定义WorkManager插桩测试出现NoSuchMethodException问题求助

问题根源与修复方案

你遇到的NoSuchMethodException核心原因是:测试环境中的WorkManager没有使用Hilt的WorkerFactory,它仍在尝试用默认的(Context, WorkerParameters)构造方法创建SyncWorker,但你的Worker依赖@AssistedInject注入其他依赖,并没有这个默认构造方法,因此抛出找不到方法的异常。

下面是具体的修复步骤:

1. 在测试类中注入HiltWorkerFactory并配置到WorkManager

修改你的SyncWorkerTest,确保Hilt完成注入后,将HiltWorkerFactory传入WorkManager的测试配置中:

@HiltAndroidTest
class SyncWorkerTest {
    @get:Rule val hiltRule = HiltAndroidRule(this)
    // 注入HiltWorkerFactory
    @Inject lateinit var hiltWorkerFactory: HiltWorkerFactory
    private val context: Context get() = InstrumentationRegistry.getInstrumentation().targetContext

    @Before fun setUp() {
        // 先执行Hilt注入,确保hiltWorkerFactory被初始化
        hiltRule.inject()
        
        // 初始化测试用WorkManager时,显式设置HiltWorkerFactory
        val config = Configuration.Builder()
            .setMinimumLoggingLevel(Log.DEBUG)
            .setExecutor(SynchronousExecutor())
            .setWorkerFactory(hiltWorkerFactory) // 关键:添加这一行
            .build()
        WorkManagerTestInitHelper.initializeTestWorkManager(context, config)
    }

    // 你的测试方法保持不变
    @Test fun testDoWork() {
        val request = SyncWorker.startSyncJob()
        val workManager = WorkManager.getInstance(context)
        val testDriver = WorkManagerTestInitHelper.getTestDriver(context)!!
        workManager.enqueueUniqueWork(
            SyncWorker.SyncWorkName,
            ExistingWorkPolicy.REPLACE,
            request,
        )
        val preRunWorkInfo = workManager.getWorkInfoById(request.id).get()
        Assert.assertEquals(WorkInfo.State.ENQUEUED, preRunWorkInfo.state)
        testDriver.setAllConstraintsMet(request.id)
    }
}

2. 验证依赖版本一致性(可选但建议)

确保你的work-testing依赖版本和项目中work-runtime的版本完全一致,比如项目中如果使用的是work-runtime:2.7.1,测试依赖的work-testing也保持2.7.1,避免版本兼容性问题。

为什么这样能解决问题?

在测试环境中,WorkManager不会自动复用你MyApplication里配置的HiltWorkerFactory——因为测试时使用的是HiltTestApplication(你通过自定义TestRunner替换了),而WorkManager的测试初始化是手动调用的,所以必须显式将Hilt注入的WorkerFactory传入测试配置,这样WorkManager才能通过Hilt正确创建带依赖注入的SyncWorker实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:57:47