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

问题描述:

我的咖啡怠速资源不工作 - 它编译和运行,但不再等待足够长的时间从'网络返回结果。你怎么得到一个Idlingresource工作在Kotlin与协程


  1. 开始https://github.com/chiuki/espresso-samples/tree/master/idling-resource-okhttp
  2. 转换的主要活动科特林 - 测试(这仍然是在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和安口的bg您使用的是不同的执行机构,该idlingresource经理不知道,所以虽然它可能被执行的应用程序从管理者的角度闲置,从而结束了测试。

要解决这个问题,你需要注册任何执行机制bg用途的IdlingResource,所以当有事情发生在执行线程它可以识别。

+0

“无论什么执行机制BG使用” - 这是当然的问题。不幸的是,我们使用的是Follestad材质对话框而不是DialogFragment,因此我们不能轻松(afaik)检查dialogfragment的存在(例如进度对话框) – nAndroid

您必须创建一个IdlingResource来告诉Espresso应用程序当前是否闲置(如Kiskae写的)。用于协程的AFAIK不存在可以告诉你是否有协程运行的*注册表。

因此,您必须使用CountingIdlingResource自行跟踪documentation中的建议。这种便利async添加-wrapper到您的项目:

public fun <T> asyncRes(
     idlingResource: CountingIdlingResource, 
     context: CoroutineContext = DefaultDispatcher, 
     start: CoroutineStart = CoroutineStart.DEFAULT, 
     parent: Job? = null, 
     block: suspend CoroutineScope.() -> T 
): Deferred<T> = async(context, start, parent) { 
    try { 
     idlingResource.increment() 
     block() 
    } finally { 
     idlingResource.decrement() 
    } 
} 

添加的CountingIdlingResource一个实例的活动里面,叫asyncRes代替async并传递CountingIdlingResource

class MainActivity : Activity() { 

    // Active coroutine counter 
    val idlingResource = CountingIdlingResource("coroutines") 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
     doCallAsync() 
    } 

    private fun doCallAsync() = asyncRes(idlingResource, UI) { 
     ... 
    } 
    ... 
}