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

Hilt+Android插桩测试:Compose注入ViewModel失败问题排查

Hilt Compose ViewModel 插桩测试问题解决

问题概述

在运行注入Hilt ViewModel的Composable组件插桩测试时,先后遇到两类异常:

  1. 初始阶段报错The component was not created. Check that you have added the HiltAndroidRule,将@EntryPoint改为@EarlyEntryPoint后解决。
  2. 新异常:Cannot create an instance of class com.test.MyViewModel,需进一步配置。

现有配置梳理

Composable组件代码

@Composable
fun MyScreen(
   viewModel: MyViewModel = hiltViewModel()
) {
}

测试类代码

@HiltAndroidTest
class MyComposeTest {

   @get:Rule(order = 0)
   var hiltRule = HiltAndroidRule(this)

   @get:Rule(order = 1)
   val composeRule = createComposeRule()

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

   @Test
   fun canary() {
    // 执行测试逻辑
   }
}

自定义TestRunner

class CustomTestRunner : AndroidJUnitRunner() {
    override fun newApplication(cl: ClassLoader?, name: String?, context: Context?): Application {
        return super.newApplication(cl, HiltTestApplication::class.java.name, context)
    }
}

build.gradle配置

android {
    defaultConfig {
        testInstrumentationRunner "com.example.android.dagger.CustomTestRunner"
    }
}

关键解决步骤

1. 确保ViewModel符合Hilt注解要求

MyViewModel必须用@HiltViewModel标记,且构造函数添加@Inject注解,否则Hilt无法实例化:

@HiltViewModel
class MyViewModel @Inject constructor(
    // 这里添加需要注入的依赖项,比如Repository等
) : ViewModel() {
    // ViewModel业务逻辑
}

2. 替换Compose规则为AndroidComposeRule

createComposeRule()默认使用无上下文的测试容器,而hiltViewModel()需要关联Hilt管理的Activity上下文。将测试中的Compose规则替换为:

@get:Rule(order = 1)
val composeRule = createAndroidComposeRule<ComponentActivity>()

该规则会创建一个受Hilt管理的Activity实例,确保ViewModel能被正确注入。

3. 验证测试依赖完整性

确保build.gradle中包含Hilt测试相关依赖(版本需与项目Hilt版本一致):

androidTestImplementation "com.google.dagger:hilt-android-testing:2.48"
kaptAndroidTest "com.google.dagger:hilt-android-compiler:2.48"

4. 正确启动Composable

在测试方法中通过setContent加载Composable:

@Test
fun canary() {
    composeRule.setContent {
        MyScreen()
    }
    // 添加断言逻辑,例如验证UI元素状态
}

验证说明

完成上述配置后,Hilt就能正确为Composable注入ViewModel。核心原因是:AndroidComposeRule提供了Hilt管理的Activity上下文,hiltViewModel()能通过该上下文获取Hilt组件实例,结合ViewModel的正确注解,完成依赖注入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:53:12