你怎么得到一个Idlingresource工作在Kotlin与协程

我的Espresso怠速资源不工作 – 它编译并运行,但不再等待足够长的时间来从“网络”返回结果。


  1. 从https://github.com/chiuki/espresso-samples/tree/master/idling-resource-okhttp开始
  2. 将主要活动转换为Kotlin – test(仍然在java中)仍然可以与OKHttpIdlingResource一起使用
  3. 转换到anko协程调用,而不是retrofit.enqueue – 测试不再起作用。

以下是MainActivity的全部新代码

import android.app.Activity import android.os.Bundle import android.widget.TextView import kotlinx.coroutines.experimental.android.UI import kotlinx.coroutines.experimental.async import org.jetbrains.anko.coroutines.experimental.bg import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) doCallAsync() } private fun doCallAsync() = async(UI) { val user = bg { getUser() } val name = user.await().name val nameView = findViewById(R.id.name) as TextView nameView.text = name; } private fun getUser(): User { val retrofit = Retrofit.Builder() .baseUrl("https://api.github.com/") .addConverterFactory(MoshiConverterFactory.create()) .client(OkHttpProvider.getOkHttpInstance()) .build() val service = retrofit.create(GitHubService::class.java) val response = service.getUser("chiuki").execute().body() return response!! } } 

Convert to anko coroutine call instead of retrofit.enqueue - test no longer works.

retrofit.enqueue使用OkHttp的调度程序。 这就是“空闲资源okhttp”识别并传达给空闲资源管理器。

但是,通过使用retrofit.execute和anko的bg您正在使用不同的执行机制,即空闲资源管理器不知道,所以虽然它可能正在执行的应用程序是从经理的角度来看是闲置的,从而结束测试。

为了解决这个问题,你需要为bg使用的任何执行机制注册一个IdlingResource ,这样它就可以识别在该执行线程上发生了什么事情。