【发布时间】:2019-09-10 21:31:31
【问题描述】:
我有改装服务
interface Service {
@PUT("path")
suspend fun dostuff(@Body body: String)
}
在android视图模型中使用。
class VM : ViewModel(private val service: Service){
private val viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
val state = MutableLiveData<String()
init {
uiScope.launch {
service.doStuff()
state.value = "lol"
}
}
override fun onCleared(){
viewModelJob.cancel()
}
}
我想写一个取消视图模型的测试。这将通过模拟服务和延迟来完成,以使 co 例程无法完成。在阻塞的同时,我们调用 onCleared 来取消 co 例程。这应该可以防止状态被设置...
@Test
fun `on cleared - cancels request`() = runBlocking {
//given
`when`(service.doStuff()).thenAnswer { launch { delay(1000) } }
val vm = ViewModel(service)
// when
vm.cleared()
//then
assertThat(vm.state, nullValue())
}
但是,vm.state 似乎总是被设置???清除协同例程被取消的范围时,最好的测试方法是什么?
【问题讨论】:
-
状态将设置在
init,所以它永远不可能是null。
标签: android kotlin mockito kotlin-coroutines mockito-kotlin