Compose UI测试中如何注入ViewModel?解决实例创建失败问题
问题解决:Compose UI测试中Hilt注入ViewModel失败
核心错误原因
- 你使用的
createComposeRule()默认生成无Hilt支持的空Activity,hiltViewModel()无法获取Hilt的依赖注入容器,导致ViewModel实例化失败。 MyUseCases作为ViewModel的构造依赖,测试环境中Hilt没有对应的绑定实现,无法提供该实例。
具体修复步骤
1. 替换Compose测试规则为Hilt支持的Activity规则
将普通的createComposeRule()替换为createAndroidComposeRule<HiltTestActivity>(),确保Compose内容运行在已初始化Hilt的Activity上下文里。
2. 确保Hilt规则优先执行
调整规则顺序,让HiltAndroidRule先于Compose规则初始化,保证Hilt容器提前就绪。
3. 提供MyUseCases的测试依赖
用Mock库(如MockK)创建MyUseCases的模拟实例,通过Hilt的@BindValue注解注入到测试容器中,让Hilt能解析该依赖。
修复后的完整测试代码
@HiltAndroidTest class MyScreenKtTest { @get:Rule(order = 0) val hiltTestRule = HiltAndroidRule(this) @get:Rule(order = 1) val composeTestRule = createAndroidComposeRule<HiltTestActivity>() lateinit var navController: TestNavHostController // 用MockK提供MyUseCases的测试实例 @BindValue val mockMyUseCases: MyUseCases = mockk(relaxed = true) @Before fun init() { hiltTestRule.inject() // 初始化TestNavHostController并关联Activity上下文 navController = TestNavHostController(composeTestRule.activity) } @Test fun DemoTestFunction() { composeTestRule.setContent { MyScreen( myViewModel = hiltViewModel(), navController = navController ) } composeTestRule.onNodeWithText("My name").assertIsDisplayed() } }
额外注意事项
- 确保你的测试依赖中包含
hilt-android-testing和mockk(或其他Mock库)。 - 如果不需要模拟
MyUseCases的行为,也可以提供真实的测试实现类,通过@BindValue注入。
内容的提问来源于stack exchange,提问作者ChandrimG
相关产品推荐
相关产品推荐

