我有这个单元测试:
@Test
fun `should emit user repos on success`() = rule.dispatcher.runBlockingTest {
// GIVEN
val repo = Repo(name = "someRepo1", owner = RepoOwner(TEST_USERNAME), stars = 55)
val channel = Channel<Repo>()
val flow = channel.consumeAsFlow()
doReturn(flow)
.whenever(repository)
.getUserRepos(TEST_USERNAME)
// WHEN
launch {
channel.send(repo)
}
userDetailViewModel.lookupUserRepos(TEST_USERNAME)
// THEN
verify(userReposObserver).onChanged(listOf(repo))
}
它将在视图模型中测试此代码:
@ExperimentalCoroutinesApi
fun lookupUserRepos(login: String) {
viewModelScope.launch {
val flow = userRepository.getUserRepos(login)
_userRepos.value = flow
.catch { _isUserReposError.value = true }
.toList()
}
}
调试显示流确实获得了repo
,但是有关toList()
的某些问题使测试失败(我得到测试失败Wanted but not invoked observer.onChanged...no interactions with this mock
非测试有效,但使用toList()
中断进行测试。任何帮助表示赞赏。