当前位置: 首页 > 知识库问答 >
问题:

测试涉及AsyncTask内部侦听器回调的类

戚默
2023-03-14

我正在尝试测试在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(..., ..., ...)
}

我现在遇到的错误是:

线程中的异常...java.lang.RuntimeException:未模拟Android.os.AsyncTask中的方法执行。详见http://g.co/androidstudio/not-mocked。在android.os.asynctask.execute(asynctask.java)

共有2个答案

庄飞
2023-03-14

下面的示例演示了如何在JUnit中测试Asynctasks。

/**
 * @throws Throwable
 */
public void testAsynTask () throws Throwable {
    // create  a signal to let us know when our task is done.
    final CountDownLatch signal = new CountDownLatch(1);

    /* Just create an in line implementation of an asynctask. Note this
     * would normally not be done, and is just here for completeness.
     * You would just use the task you want to unit test in your project.
     */
    final AsyncTask<String, Void, String> myTask = new AsyncTask<String, Void, String>() {

        @Override
        protected String doInBackground(String... arg0) {
            //Your code to run in background thread.
            return "Expected value from background thread.";
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            /* This is the key, normally you would use some type of listener
             * to notify your activity that the async call was finished.
             *
             * In your test method you would subscribe to that and signal
             * from there instead.
             */
            signal.countDown();
        }
    };

    // Execute the async task on the UI thread! THIS IS KEY!
    runTestOnUiThread(new Runnable() {

        @Override
        public void run() {
            myTask.execute("Do something");
        }
    });

    /* The testing thread will wait here until the UI thread releases it
     * above with the countDown() or 30 seconds passes and it times out.
     */
    signal.await(30, TimeUnit.SECONDS);

    // The task is done, and now you can assert some things!
    assertTrue("Expected Value", true);
}
师建德
2023-03-14

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

更多信息请访问:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests

 类似资料:
  • 方法正在传递,这太好了,但是为什么的结果会出现在库测试结果中,我不明白。我怎么才能避免呢? 我在这里列出了和的完整代码。

  • 问题内容: 如何启用处理JPA回调的Hibernate事件侦听器? 当前,我正在将Hibernate 4与SessionFactory配置一起使用,但是当我保留一个对象时,JPA回调无法正常运行。 任何建议都是最欢迎的。 源代码 临时实体类: TempVal类: MainClass类: Hibernate配置: 程序输出 程序输出如下: 预期的输出将是: 问题答案: 这个问题基本上是一样的。 事实

  • 我有一个JPanel,我的(游戏)程序在其中绘制了一些由一段代码决定的东西。到目前为止,一切都很好。我写了一个非常基本的侦听器,它侦听程序背景模型的变化,然后应该告诉GUI更新,即移动游戏外观。 所有这些都发生在mouseListener触发的方法中。 我猜这就是问题所在,因为在JPanel中再次单击鼠标会正确更新JPanel,我可以看到模型移动的部分。 JPanel的代码: 更新调用了很多AWT

  • 问题内容: 我必须在java swing actionperformed方法内部调用一个方法。但是,当我单击按钮时,什么也没有发生。如何解决这个问题呢? 问题答案: 您需要向按钮添加动作侦听器,以响应单击事件:

  • 在我的测试中,我在尝试在我正在测试的函数中打回调函数时,很难得到完整的覆盖。这里是功能: 因此,除了函数回调之外,我已经覆盖了函数: 我似乎不知道如何通过测试来达到这个目的。 在上面,我把请求像这样删掉了 所以我不确定如何才能让它点击回调并测试它。可能需要一些洞察力,因为这对我来说还是新的。谢谢 所以我开始尝试一个简单的测试-

  • 问题内容: 我正在尝试在ActionListener中停止计时器。以下是我正在尝试执行的代码。我打算停止在actionPerformed方法内满足特定条件时创建的计时器。timer.stop()不起作用,编译器不允许我这样做。 任何帮助。建议,建议将非常有帮助。 } 在此先感谢克里希南 问题答案: 也可能: 或者,使用事件对象获取源(并将其 强制转换为boo ): 或者,将计时器保留在实例变量中,