Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Mockito Kotlin协同程序测试取消_Android_Kotlin_Mockito_Kotlin Coroutines_Mockito Kotlin - Fatal编程技术网

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测试库仍处于实验阶段。