android - Mvvm Coroutine Mockito 测试 ViewModel 给出错误
问题描述
我测试视图模型的测试用例如下所示:
@Before
fun setUp() {
loginActivityViewModel = LoginActivityViewModel(loginRepository)
.apply { users.observeForever(userObserver) }
}
@Test
fun `check user response when get successful response from server`() {
testCoroutineRule.runBlockingTest {
//Given
whenever(loginRepository.getLoginResponse(loginRequest)).then(Answer { loginResponse })
//When
loginActivityViewModel.loginResponse(loginRequest)
//Then
verify(userObserver).onChanged(Resource.loading(data = null))
verify(userObserver).onChanged(Resource.success(data = loginResponse))
}
}
@Test
fun `check user response when get unsuccessful response from server`() {
testCoroutineRule.runBlockingTest {
//Given
whenever(loginRepository.getLoginResponse(loginRequest)).thenThrow(Error("Some error"))
//When
loginActivityViewModel.loginResponse(loginRequest)
//Then
verify(userObserver).onChanged(Resource.loading(data = null))
verify(userObserver).onChanged(Resource.error(message = "Some error"))
}
}
在第一个测试用例中成功运行,但是当它运行第二个时出现此错误:
需要但未调用: userObserver.onChanged( Resource(status=ERROR, data=null, message=Some error) ); -> 在 com.android.loginapp.viewmodel.LoginActivityViewModelTest$check user response when get unsuccessful response from server$1.invokeSuspend(LoginActivityViewModelTest.kt:83)
但是,与此模拟只有 1 次交互: userObserver.onChanged( Resource(status=LOADING, data=null, message=null) ); -> 在 androidx.lifecycle.LiveData.considerNotify(LiveData.java:131)
我的 viewModel 网络调用方法如下所示:
fun loginResponse(loginRequest: LoginRequest) {
viewModelScope.launch {
users.postValue(Resource.loading(null))
try {
val usersFromApi = loginRepository.getLoginResponse(loginRequest)
users.postValue(Resource.success(usersFromApi))
} catch (e: Exception) {
users.postValue(Resource.error(e.message.toString()))
}
}
}
不知道为什么它会给出这个错误。
解决方案
我需要使用.thenThrow(RuntimeException("test error"))
,只有它会通过。
推荐阅读
- ruby - Ruby - .each 方法 - 编码未执行
- android - 位图保存在图库中时显示自定义 ProgressDialog
- nsoutlineview - 如果同一个子对象多次存在,如何确保 NSOutlineView.parent(forItem:) 返回正确的父对象?
- python - 如何将一个数字(以小时为单位的时间)指定为一系列数字(以天为单位的时间)?
- python - AttributeError:类型对象“平台”没有属性“y”
- python - Pandas:如果列名存在于不同列中,则用 1 填充列值
- javascript - 如何从路由参数中正确获取数据?
- cmake - 在 compile_commands.json 中使用 CMake find_package 时使用 -I 而不是 -isystem
- typo3 - Typo3 n:m 关系同一张表 - 不同的翻译结果
- javascript - 使用 moneybutton/bsv js 库创建比特币 SV 交易