我的Espresso空闲资源无法运行 - 它会编译并运行,但不再等待足够的时间从'net返回结果。
以下是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!!
}
}
答案 0 :(得分:1)
你必须创建一个IdlingResource
告诉Espresso应用程序当前是否空闲(如Kiskae所写)。对于协同程序的AFAIK,不存在可以告诉您是否正在运行协程的中央注册表。
因此,您必须使用CountingIdlingResource
按照documentation中的建议自行跟踪这些内容。将此便利性async
- 包装器添加到您的项目中:
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) {
...
}
...
}
答案 1 :(得分:0)
Convert to anko coroutine call instead of retrofit.enqueue - test no longer works.
retrofit.enqueue
使用OkHttp的调度程序。这就是&#34; idling-resource-okhttp&#34;承认并与闲置资源经理沟通。
然而,通过使用retrofit.execute
和anko&#39; s bg
,您正在使用idlingresource管理器不知道的不同执行机制,因此当它可能正在执行时,应用程序从经理的观点,从而结束了考验。
要解决此问题,您需要为IdlingResource
使用的任何执行机制注册bg
,以便它可以识别该执行线程上发生了什么。