На самом деле ресурсы холостого хода - самые сложные моменты Эспрессо.
Вы должны реализовать это, если в вашем тесте вам нужно ждать/синхронизировать с какой-либо асинхронной фоновой задачей. По умолчанию Espresso ожидает завершения операций пользовательского интерфейса в текущей очереди сообщений и выполнения AsyncTasks по умолчанию (синхронизируется с пулом потоков AsyncTask по умолчанию), прежде чем перейти к следующей тестовой операции. Ознакомьтесь с этим для AsyncTasks. Однако, если вы запускаете другой поток, например, для связи с какой-либо веб-службой, вы должны использовать IdlingResource
.
Любой Thread.sleep()
, который вам может понадобиться, является сигналом того, что вам может понадобиться ресурс холостого хода.
Теперь о том, как написать ресурс холостого хода. Это легко может сделать разработчик кода, потому что они теперь знают, как они оценивают этот момент.
Предполагается, что это должно быть что-то вроде этого:
public class DownloadIdlingResource extends BaseIdlingResource { ... }
Предполагается определить, когда этот ресурс простаивает или нет.....
Тест, который хотел сказать Espresso, что ему нужно дождаться этого ресурса холостого хода, должен был определить во время инициализации тестового класса этот ресурс холостого хода (setUp()
и т. д.) или активировать его при необходимости. Это означает, что вам есть что ждать, но оно еще не активировано. Например, бездействующий ресурс загрузки может иметь слушателя, чтобы установить бездействующий ресурс в состояние, отличное от бездействия (setIdle(false)
), когда загрузка начинается, и возвращать его в состояние бездействия, когда оно завершено (setIdle(true)
). Эспрессо продолжается всем остальным персоналом, если все простаивающие ресурсы простаивают (нечего ждать, чтобы закончить). Детали реализации ресурса бездействия сильно зависят от реализации приложения.
Что можно сказать о ресурсе холостого хода в целом:
isIdleNow()
реализовать логику, когда ресурс простаивает
registerIdleTransitionCallback
будет вызван Espresso, когда ресурс будет зарегистрирован, и даст вам ResourceCallback
.
Когда ресурс переходит из режима занятости в режим ожидания, на практике вы получаете обратный вызов от фоновой задачи о том, что операция завершена (данные карты были загружены или загрузка отменена), вы должны callonTransitionToIdle()
на зарегистрированном ResourceCallback
.
В getName()
вы должны вернуть имя ресурса, который используется для ведения журнала.
Пожалуйста, будьте осторожны, чтобы не было взаимоблокировок, таких как простаивающие ресурсы. Существует тайм-аут для простоя ресурсов. Тест мог быть прерван сообщением о том, что не так с ресурсом холостого хода.
Мне жаль, что я не могу написать более конкретные примеры, но это действительно зависит от реализации вашего приложения.
person
Anna
schedule
26.01.2015