2015-08-09 3 views
3

Picasso использует потоки для загрузки изображений в фоновом режиме. Даже при загрузке из активов есть небольшая задержка до тех пор, пока она не появится, что заставляет фотографии не появляться на захвате ложкой. Я мог бы добавить 1-й сон в тест, но мне было интересно, есть ли лучший способ.Espresso + Picasso + Spoon

Я попытался установить Downloader или ее RequestHandler, чтобы вернуть изображение синхронно, но я думаю, что нужно установить ExecutorService, который использует основной поток или AsyncTask (например, что эспрессо будет ждать). С модификацией мы можем использовать AsyncTask.THREAD_POOL_EXECUTOR с MainThreadExecutor, но я не уверен, как это сделать для пикассо.

В качестве обходного пути, я обернул Picasso в ImageUtil, который не будет использоваться во время инструментовки:

DebugModule { 
    @Provide 
    ImageUtil imageUtil() { 
     if (isTest) { 
      return TestImageUtil(); 
     } else { 
      return PicassoImageUtil(); 
     } 
    } 
} 

Любые предложения?

обновление: в коде picasso, пытаясь использовать Executor вместо ExecutorService, я застрял на service.shutdown().

ответ

4

Я собираюсь дать вам общий метод ожидания асинхронных задач с использованием эспрессо, потому что вы можете быть уверены, что это снова появится.

Вы не должны использовать нить, чтобы ждать, пока что-то произойдет. Это может привести к шелушению, и ваши тесты будут менее эффективными. Эспрессо был разработан с тем, чтобы избегать вызовов сна.

Вы также не должны заставлять что-то находиться на основном потоке, который обычно не находится на основной резьбе. Если это вызывает ANR, ваш тест может выйти из строя из-за неожиданного всплывающего окна. Также может быть реальная ошибка, которая возникает только при многопоточности, но теперь, когда вы заставляете что-то выполнять в основном потоке, ваши тесты могут пропустить это.

Вы на правильном пути, заменяя другую упаковку для Пикассо для тестирования. Вам нужен способ подключиться к началу запроса (прямо перед тем, как он отключится от основного потока), и когда запрос будет завершен. Переключение оболочки - один из способов сделать это.

Чтобы получить уведомление о том, когда запрос будет завершен, вы можете использовать callback version of the into method.

Теперь, когда у вас есть точки входа и выхода вашей асинхронной задачи, вы можете использовать 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

+0

Я использовал 'IdlingResource' сделать API вызовы, но есть какой-то вопрос с' onClick' (не могу найти пост на SO больше ...) Очень хороший момент о потенциальном ANR! – mbmc

+0

@eski обе ссылки мертвы –

+0

@BenPearson Я исправил пикассо один (и вы исправили эспрессо один), спасибо! – eski

Смежные вопросы