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

Robolectric测试中使用hiltViewModel与createComposeRule抛出NoSuchMethodException

问题原因
  1. 你使用的androidx.hilt:hilt-navigation-compose:1.0.0-alpha03属于早期测试版本,存在已知缺陷:在Compose测试场景中调用hiltViewModel()方法时,没有正确关联Hilt提供的ViewModel工厂,会默认尝试反射调用ViewModel的无参构造方法创建实例,而你的ExampleViewModel只有带Context参数的有参构造,因此抛出NoSuchMethodException。
  2. 额外注意:你的测试类中HiltRule和ComposeTestRule的声明顺序也可能影响注入逻辑,HiltRule初始化顺序晚于ComposeTestRule时也可能触发该异常。
解决方案
  • 方案1:升级hilt-navigation-compose依赖到稳定版本,推荐升级到1.0.0及以上正式版本,该版本已经修复了测试场景下ViewModel初始化的缺陷。注意升级后需要同步匹配你的Hilt核心依赖版本,避免版本不兼容。
  • 方案2:如果暂时无法升级依赖,可以在测试代码中手动指定ViewModelProvider.Factory为Hilt的工厂,修改测试代码如下:
@Test
fun test() {
    composeTestRule.setContent {
        // 手动传入Hilt的ViewModel工厂,替代默认实现
        hiltViewModel<ExampleViewModel>(
            factory = hiltRule.viewModelFactory
        )
    }
}
  • 方案3:调整测试规则的声明顺序,确保HiltRule在ComposeTestRule之前初始化,代码如下:
@get:Rule(order = 0)
val hiltRule = HiltAndroidRule(this)

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:24:03