Robolectric测试中使用hiltViewModel与createComposeRule抛出NoSuchMethodException
问题原因
- 你使用的
androidx.hilt:hilt-navigation-compose:1.0.0-alpha03属于早期测试版本,存在已知缺陷:在Compose测试场景中调用hiltViewModel()方法时,没有正确关联Hilt提供的ViewModel工厂,会默认尝试反射调用ViewModel的无参构造方法创建实例,而你的ExampleViewModel只有带Context参数的有参构造,因此抛出NoSuchMethodException。 - 额外注意:你的测试类中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
相关产品推荐
相关产品推荐

