android - 你如何让 Idling 资源在 Kotlin 中与协程一起工作

标签 android kotlin android-espresso okhttp anko

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


  1. https://github.com/chiuki/espresso-samples/tree/master/idling-resource-okhttp 开始
  2. 将主要 Activity 转换为 Kotlin - 测试(仍在 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!!

    }
}

最佳答案

转换为 anko 协程调用而不是 retrofit.enqueue - 测试不再有效。

retrofit.enqueue 使用 OkHttp 的调度程序。这是“idling-resource-okhttp”识别并与 idlingresource 管理器通信的内容。

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

要解决此问题,您需要为 bg 使用的任何执行机制注册一个 IdlingResource,以便它可以识别该执行线程何时发生某些事情。

关于android - 你如何让 Idling 资源在 Kotlin 中与协程一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45682582/

相关文章:

kotlin - kotlin 中的 javascript 匿名对象

Android 支持存储库未显示在 Android Studio SDK 管理器中

android - 在 Google Maps Api v2 中添加多个标记

java - Android:使用 MediaRecorder 中的 getMaxAmplitude(),同时使用 TarsosDSP 中的 PercussionOnsetDetector

java - 每个方法/类的平均行数是多少?

android-studio - Android Studio - 在循环中多次运行相同的测试用例

android - 测试 Android 应用程序时无法注入(inject)点击

android - 插入AssetImage之后随机出现 “lost connection to device”

android - MVP Presenter 未正确注入(inject)

kotlin - Kotlin 中的类型别名和扩展函数