Espresso + Picasso + Spoon

4
Picasso使用线程在后台加载图像。即使从资产中加载,也会有轻微的延迟,直到它显示出来,这会导致图片在spoon捕获时不出现。我可以在测试中添加1秒的休眠时间,但我想知道是否有更好的方法。
我尝试设置一个Downloader或RequestHandler以同步返回图像,但我认为我需要设置一个使用主线程或AsyncTask(这样espresso就会等待)的ExecutorService。对于retrofit,我们可以使用AsyncTask.THREAD_POOL_EXECUTOR和MainThreadExecutor,但我不确定如何在picasso中实现。
作为一种解决方法,我将picasso包装在ImageUtil中,在仪器测试期间不使用它。
DebugModule {
    @Provide
    ImageUtil imageUtil() {
        if (isTest) {
            return TestImageUtil();
        } else {
            return PicassoImageUtil();
        }
    }
}

有什么建议吗?

更新:在 Picasso 的代码中,尝试使用 Executor 而不是 ExecutorService,我卡在了 service.shutdown() 上。

1个回答

5
我将为您提供使用Espresso等待异步任务的通用方法,因为您可以确定这将再次出现。
您不应该使用线程休眠来等待事件发生。这可能会导致不稳定性,并使您的测试效率降低。Espresso旨在避免休眠调用。
您也不应该强制让不通常在主线程上的内容在主线程上运行。如果这导致ANR,则由于意外的对话框弹出,您的测试可能会失败。还可能存在仅在多线程时发生的真正错误,但现在您正在强制执行某些操作以在主线程上执行,因此您的测试可能会忽略它。
更换Picasso的不同包装器进行测试是正确的做法。您需要一种方式来挂钩请求何时启动(就在它离开主线程之前),以及请求何时完成。更换包装器是实现这一点的一种方法。
要在请求完成时收到通知,可以使用into方法的回调版本。
现在,您已经拥有了异步任务的入口和出口点,可以使用CountingIdlingResource来防止测试继续进行,直到任务完成。只需在任务开始之前递增计数器,在完成时递减即可。
以下是如何使用该类的示例:https://android.googlesource.com/platform/frameworks/testing/+/android-support-test/espresso/sample/src/androidTest/java/android/support/test/testapp/AdvancedSynchronizationTest.java?autodive=0%2F%2F

我曾经使用IdlingResource来进行API调用,但是在onClick方面出现了一些问题(现在在SO上找不到这篇文章了...)。非常好的一点是提到了潜在的ANR问题! - mbmc
@eski,这两个链接都失效了。 - Ben Pearson
@BenPearson,我修复了Picasso(而你修复了Espresso),谢谢! - eski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接