android - 在 AsyncTask 中测试一个涉及监听器回调的类

标签 android junit mockito android-testing mockito-kotlin

我正在尝试测试在 AsyncTask 中触发的监听器回调,

监听类:

interface LoaderListener {
    fun onByteSuccess(..., ..., ...)

    fun onByteFailure(..., ...)
}

包含 AsyncTask 的类:

class Loader {

override fun handleStreamTask(){
        InputStreamHandlingTask(..., ...).execute(byteArray)
    }

private inner class InputStreamHandlingTask constructor(
            internal var ...,
            internal var ...
        ) : AsyncTask<ByteArray, Void, ByteArray>() {

            override fun doInBackground(vararg params: ByteArray): ByteArray? {
                val response = params[0]
                .....
                return response
            }

            override fun onPostExecute(byteArray: ByteArray?) {
                   if (byteArray != null) {
                       listener.onByteSuccess(..., ..., ...)
                   } else {
                       listener.onByteFailure(..., ...)
                   }
            }

        }
}

我要进行的测试:

@Test
fun testIfListenerCalled(){
    val loader: Loader = mock()
    val loaderListener: LoaderListener = mock()

    loader.handleStreamTask()

    verify(loaderListener).onByteSuccess(..., ..., ...)
}

我目前遇到的错误:

Exception in thread ... java.lang.RuntimeException: Method execute in android.os.AsyncTask not mocked. See http://g.co/androidstudio/not-mocked for details. at android.os.AsyncTask.execute(AsyncTask.java)

最佳答案

如果这是在本地计算机上运行而不是在 Android 设备上运行的单元测试,则不能模拟依赖于 Android 框架的类,例如 AsyncTask。相反,应该将其实现为插桩测试,而不是在 Android 设备上运行的单元测试,或者使用可以在本地计算机上模拟 Android 框架的框架。

更多信息在这里:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests

关于android - 在 AsyncTask 中测试一个涉及监听器回调的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56823203/

相关文章:

java - mockito - 伪造 addObserver

java - 在访问私有(private)方法和变量时使用反射API好吗?

java - Junit实例创建分别通过方法或类

android - Google TTS Engine 是否适用于所有 Android 手机,我可以从哪里获得它?

android - 在 IOS 和 Android 上 react native fbsdk 用户更改问题

java - 在 Mockito 中解析

android - 为什么在内联创建mockito模拟时我会看到性能提升?

java - 不能模拟/ spy 类 java.util.Optional

java.lang.ClassCastException 接口(interface)在 android java 上

android - 如何在带有 TabLayout 的 Fragment 中使用 CardView 行实现 RecyclerView