如何修复JetPack Compose单元测试中的ClassCastException问题
问题解决方法
不用修改ViewModel和仓库代码,问题大概率出在单元测试的Mockk配置以及协程处理上,按以下步骤调整即可:
必须用
coEvery模拟挂起函数
因为signUp是挂起函数,不能用普通的every来模拟,否则会导致返回值处理异常。正确的模拟写法:coEvery { authRepository.signUp(any(), any()) } returns Result.failure(Exception("测试错误"))等待ViewModel协程执行完成
如果onPressSignUp是通过viewModelScope.launch调用仓库方法的,测试时需要等待协程执行完毕再做断言,否则会出现状态未更新的情况。在runTest(Jetpack Test库推荐的测试协程方法)中调用advanceUntilIdle():@Test fun onPressSignUp_failureUpdatesState() = runTest { // 初始化mock和ViewModel val mockRepo = mockk<AuthRepository>() coEvery { mockRepo.signUp(any(), any()) } returns Result.failure(Exception("注册失败")) val viewModel = YourSignUpViewModel(mockRepo) // 执行测试方法 viewModel.onPressSignUp("test@test.com", "123456") advanceUntilIdle() // 等待viewModelScope中的所有协程完成 // 断言状态更新 assertTrue(viewModel.uiState.value is SignUpState.Failure) }避免使用relaxed mock
如果初始化mock时用了mockk(relaxed = true),可能会默认返回Unit,和你期望的Result<Unit>冲突,导致类型转换异常。建议明确模拟需要的函数,不要用relaxed模式。
内容的提问来源于stack exchange,提问作者kalinor
相关产品推荐
相关产品推荐

