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

Compose UI测试中如何注入ViewModel?解决实例创建失败问题

问题解决:Compose UI测试中Hilt注入ViewModel失败

核心错误原因

  1. 你使用的createComposeRule()默认生成无Hilt支持的空Activity,hiltViewModel()无法获取Hilt的依赖注入容器,导致ViewModel实例化失败。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:40:19