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

时间:2017-08-14 20:30:36

标签: android kotlin android-espresso okhttp3 anko

我的Espresso空闲资源无法运行 - 它会编译并运行,但不再等待足够的时间从'net返回结果。

  1. https://github.com/chiuki/espresso-samples/tree/master/idling-resource-okhttp
  2. 开始
  3. 将主要活动转换为Kotlin - 测试(仍在java中)仍然可以使用OKHttpIdlingResource
  4. 转换为anko coroutine调用而不是retrofit.enqueue - 测试不再有效。
  5. 以下是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!!
    
        }
    }

2 个答案:

答案 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,以便它可以识别该执行线程上发生了什么。