我想要真实的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/