浓缩咖啡 + 毕加索 + 勺子

mbm*_*bmc 4 android unit-testing mocking picasso android-espresso

Picasso 使用线程在后台加载图像。即使从资产加载时,在它出现之前也会有轻微的延迟,这会导致图片不会出现在用勺子捕捉时。我可以在测试中添加 1s 睡眠,但我想知道是否有更好的方法。

我试图设置 aDownloader或 aRequestHandler以同步返回图像,但我认为我需要设置一个ExecutorService使用主线程的 a 或 an AsyncTask(这样浓缩咖啡将等待)。通过改造,我们可以使用AsyncTask.THREAD_POOL_EXECUTORwithMainThreadExecutor但我不确定如何为毕加索做到这一点。

作为一种解决方法,我将 picasso 包装在一个 ImageUtil 中,它不会在检测期间使用:

DebugModule {
    @Provide
    ImageUtil imageUtil() {
        if (isTest) {
            return TestImageUtil();
        } else {
            return PicassoImageUtil();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么建议?

更新:在毕加索的代码中,尝试使用Executor代替 ExecutorService,我被困在service.shutdown().

esk*_*ski 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