Android Mockito Kotlin协同程序测试取消
我有改装服务Android Mockito Kotlin协同程序测试取消,android,kotlin,mockito,kotlin-coroutines,mockito-kotlin,Android,Kotlin,Mockito,Kotlin Coroutines,Mockito Kotlin,我有改装服务 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
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()
}
}
然而,看起来vm.state总是被设置???当清除一个被取消的共同例程的作用域时,最好的测试方法是什么?这里的问题是
然后回答{launch{delay(1000)}
,这有效地使您的doStuff
方法如下所示:
suspend fun doStuff() {
launch { delay(1000) }
}
正如您所看到的,这个函数实际上并没有挂起,它启动一个协程并立即返回。在这里真正起作用的是thenarse{delay(1000)}
,它不起作用,因为Mockito中没有thenarse
的挂起版本(至少据我所知)
我建议切换到mocking库,它本机支持kotlin。然后您可以编写
coEvery{doStuff()}coAnswers{delay(1000)}
,它将使您的测试通过(在修复了C的所有语法错误之后)。这里的问题在于thenAnswer{launch{delay(1000)}
,这有效地使您的doStuff
方法看起来像这样:
suspend fun doStuff() {
launch { delay(1000) }
}
正如您所看到的,这个函数实际上并没有挂起,它启动一个协程并立即返回。在这里真正起作用的是thenarse{delay(1000)}
,它不起作用,因为Mockito中没有thenarse
的挂起版本(至少据我所知)
我建议切换到mocking库,它本机支持kotlin。然后您可以编写
coEvery{doStuff()}coAnswers{delay(1000)}
,它将使您的测试通过(在修复了C的所有语法错误之后)。状态将在init
中设置,因此它永远不能为null
。状态将在init
中设置,所以它不能是null
。使用onBlocking
。然而,我还不确定所有测试库中的协同程序支持有多可靠。即使是官方的JetBrains kotlinx coroutines测试库仍处于实验阶段。在mockito kotlin中有一种模拟暂停乐趣的方法。使用onBlocking
。然而,我还不确定所有测试库中的协同程序支持有多可靠。即使是官方的JetBrains kotlinx coroutines测试库仍处于实验阶段。