mbm*_*bmc 4 android unit-testing mocking picasso android-espresso
Picasso 使用线程在后台加载图像。即使从资产加载时,在它出现之前也会有轻微的延迟,这会导致图片不会出现在用勺子捕捉时。我可以在测试中添加 1s 睡眠,但我想知道是否有更好的方法。
我试图设置 aDownloader
或 aRequestHandler
以同步返回图像,但我认为我需要设置一个ExecutorService
使用主线程的 a 或 an AsyncTask
(这样浓缩咖啡将等待)。通过改造,我们可以使用AsyncTask.THREAD_POOL_EXECUTOR
withMainThreadExecutor
但我不确定如何为毕加索做到这一点。
作为一种解决方法,我将 picasso 包装在一个 ImageUtil 中,它不会在检测期间使用:
DebugModule {
@Provide
ImageUtil imageUtil() {
if (isTest) {
return TestImageUtil();
} else {
return PicassoImageUtil();
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
更新:在毕加索的代码中,尝试使用Executor
代替 ExecutorService
,我被困在service.shutdown()
.
我将向您提供使用 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
归档时间: |
|
查看次数: |
567 次 |
最近记录: |