android - 具有由 Hilt 在仪器测试零参数构造函数中注入(inject)的可组合项的真实 ViewModel

标签 android android-jetpack-compose android-testing dagger-hilt

我想要真实的ViewModel注入(inject)到我的可组合项中。 This question's answer正在说明如何模拟注入(inject)的 View 模型,这不是我想要的。

我的可组合项正在接收如下 View 模型:

fun YourDetailsScreen(viewModel: YourDetailsViewModel = viewModel()) {

viewModel()方法是 androidx.lifecycle.viewmodel.compose 提供的内联函数包。

据我所知,我已经实现了自定义测试运行程序,我的仪器测试已使用 @HiltAndroidTest 正确配置。和 HiltAndroidRule包装我的composeTestRule像这样:

@get:Rule
val rule: RuleChain = RuleChain.outerRule(hiltAndroidRule)
   .around(composeTestRule)

当我启动可组合项时,出现以下异常:

Caused by: java.lang.InstantiationException: java.lang.Class<com.zzz.feature.onboarding.registration.yourdetails.YourDetailsViewModel> has no zero argument constructor

这是我的ViewModel的构造函数。

@HiltViewModel
class YourDetailsViewModel @Inject constructor(
    private val isFirstNameValidUseCase: IsFirstNameValidUseCase,
    private val isLastNameValidUseCase: IsLastNameValidUseCase,
    private val isPhoneNumberValidUseCase: IsPhoneNumberValidUseCase
) : ViewModel()

运行应用程序时一切都注入(inject)得很好,我只是无法让它在我的 Android 测试中工作!

最佳答案

经过几个小时的调试,发现了问题。

基本上,主要问题是我使用 createComposeRule()而不是createAndroidComposeRule<MyActivity>() ,所以HiltViewModelFactory没有使用过。

当我开始使用 createAndroidComposeRule<MyActivity>() 后如下,我的测试开始运行:

@RunWith(AndroidJUnit4::class)
@HiltAndroidTest
class MyScreenTest  {

    val hiltRule = HiltAndroidRule(this)

    val composeTestRule = createAndroidComposeRule<MyActivity>()

    @get:Rule
    val rule: RuleChain = RuleChain.outerRule(hiltRule)
        .around(composeTestRule)

    // Tests....
}

( MyActivity 必须用 @AndroidEntryPoint 进行注释)

关于android - 具有由 Hilt 在仪器测试零参数构造函数中注入(inject)的可组合项的真实 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71344878/

相关文章:

android - 如何通过 Android 中的 Google Fit 集成获取用户信息

android - 如何更新数据类的属性show compose ui可以观察到变化

kotlin - 返回后返回可组合项时撰写导航句柄

android - 为什么要等待调试器然后将调试器附加到进程?

android - 检查消息是否已通过 whatsapp 成功发送

android - 对话框未设置布局参数

android - Jetpack Compose 中列和行的 Expanded 和 LayoutSize.Expand 的区别

android - 依赖冲突 'com.android.support:support-annotations'

java - 当测试抛出异常时调用的方法

php - Android InApp 购买验证