Это сложный вопрос :). Проблема здесь в том, что после того, как поток покинет ваше приложение (Google Account Picker - внешнее приложение), Espresso завершает тест. Account Picker - это активность из пакета com.google.android.gms
, что является внешним. Как только он будет запущен, ваш тест будет завершен, и вы никогда не сможете сопоставить что-либо в диалоговом окне.
У вас есть три возможного решение, чтобы сделать тесты выполнимо:
- Используя замену на пути к классам приложения к поддельным намерениям; или
- Фиксация вашего приложения «проверяемость»; или
- Использование инъекции зависимостей, как Dagger
Я покажу, как использовать замену CLASSPATH. Техника очень проста: вы должны изолировать свое творение в отдельном классе, скажем IntentsFactory
и во время тестов переопределить этот класс.
Произнесите завод находится в com.yourapp.factories.IntentsFactory
и это что-то вроде этого:
public class IntentsFactory {
public static Intent getAccountPickerIntent (Context context) {
return AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
}
}
Вы должны создать в тестовом приложении (говорят, что это com.yourapp.tests
) пакет с тем же именем и методами, но это возвращает разные намерениях, издевались/манекен один:
public class IntentsFactory {
public static Intent getAccountPickerIntent (Context context) {
return new Intent(context, MyDummyAccountPickerActivity.class);
}
}
Всякий раз, когда ваши тесты выполнить, они будут использовать «ближайший» класс в пути к классам, то есть, IntentsFactory от ваших тестов. Вместо того, чтобы возвращать намерение, отправляющее поток в другое приложение, поток переходит к классу вашего проекта, и Espresso не закончит тесты.
Единственное предостережение здесь в том, что вам нужно будет создать MyDummyAccountPickerActivity
, который вернет результат и Bundle
, аналогичный тому, который был возвращен классом фреймворка.Деятельность должна существует в вашем приложении манифест, и вы должны будете проинструктировать свой эмулятор Dalvik выполнение, чтобы позволить классам (проверьте этот this и this ссылки) подстановку с помощью следующей командной строки:
adb shell setprop dalvik.vm.dexopt-flags v=n,o=v
adb shell stop installd
adb shell start installd
И выполнить ваши тесты.
У меня была аналогичная проблема для тестирования камеры, и это тщательно обсуждается in Espresso forum
Не могли бы вы опубликовать методы жизненного цикла своей деятельности? – Bolhoso
Bolhoso, я просто имею это в методе onCreate: 'Intent googlePicker = AccountPicker.newChooseAccountIntent (null, null, new String [] {GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null); startActivityForResult (googlePicker, Utils.PICK_ACCOUNT_REQUEST); ' И логика для выбранной учетной записи. Другие методы жизненного цикла не изменяются. –