如何解决间谍与协程的Mockito
我有一个名为ViewModel的类。
当变量shouldCheck
更改时,将调用open函数。
class ViewModel {
val shouldCheck = MutableLiveData<Boolean>()
val check by lazy {
shouldCheck.switchMap {
liveData(Dispatchers.IO) {
open()
emit(true)
}
}
}
fun open(){
println("I am open")
}
}
我创建一个简单的测试。但是验证功能打开失败
@ExperimentalCoroutinesApi
class CoroutineTestRule(private val dispatcher: CoroutineDispatcher = TestCoroutineDispatcher()) : TestWatcher() {
override fun starting(description: Description?) {
super.starting(description)
Dispatchers.setMain(dispatcher)
}
override fun finished(description: Description?) {
super.finished(description)
Dispatchers.resetMain()
}
}
@get:Rule
val coroutineScope = CoroutineTestRule()
@Before
fun setUp() {
viewModel = spy(ViewModel())
}
@Test
fun checkTest() = runBlocking {
// observe
viewModel.check.observeForever {
// ...
}
// Action
viewModel.shouldCheck.value = true
// Expected
verify(viewModel,times(1)).open()
}
在调试模式下,我检查了是否打开了函数,并打印了"I am open"
,但出现此错误。
Wanted but not invoked:
viewModel.open();
However,there were exactly 2 interactions with this mock:
如果我删除switchMap并通过了liveData(Dispatchers.IO)
测试。
但我在那里需要。
解决方法
根据Google:
我的建议是像这样注入调度程序:
class MyViewModel(private val ioDispatcher: CoroutineDispatcher)
并在测试中使用TestCoroutineDispatcher
,这可能会有帮助
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。