Android-эспрессо и подборщик аккаунтов
У меня возникают проблемы при проведении контрольно-измерительных работ с использованием эспрессо. У меня есть действие, когда при запуске приложения появляется всплывающее окно выбора учетной записи (основное действие). Если клиент нажимает кнопку "Отмена" (в диалоговом окне), всплывающее окно снова появляется; Если пользователь нажимает кнопку "Добавить", результат выбирается по результату активности.
Я не знаю, как создать простой тест с эспрессо, который будет включать в себя этот сборщик. Когда я создавал инструментальный тест с MainActivity, я получил это сообщение: никаких действий на этапе RESUMED...
public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity>{
MainActivity myActivity;
public MainActivityTest(){
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
getActivity();
}
public void testAccountPicker(){
onView(withText("Choose an account")).check(matches(isDisplayed()));
}
}
У кого-нибудь была подобная проблема?
Спасибо за ваши ответы заранее.
3 ответа
Это сложный вопрос:). Проблема в том, что, как только поток покидает ваше приложение (Google Account Picker является внешним приложением), Espresso заканчивает тестирование. Выбор аккаунта - это действие из пакета com.google.android.gms
Таким образом, внешний. Как только он начнется, ваш тест закончится, и вы никогда не сможете ничего сопоставить в диалоговом окне.
У вас есть три возможных решения, чтобы сделать ваши тесты выполнимыми:
- Использование подстановки classpath в вашем приложении для фальсификации намерений; или же
- Исправление "тестируемости" вашего приложения; или же
- Используя внедрение зависимости, как Dagger
Я покажу, как использовать подстановку classpath. Техника очень проста: вы должны изолировать создание Intent в отдельном классе, скажем, 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);
}
}
Каждый раз, когда выполняются ваши тесты, они будут использовать "ближайший" класс в classpath, то есть IntentsFactory из ваших тестов. Вместо того, чтобы возвращать намерение, которое отправляет поток в другое приложение, поток переходит к классу вашего проекта, и Espresso не заканчивает тесты.
Единственное предостережение здесь заключается в том, что вам придется создать MyDummyAccountPickerActivity
который вернет результат и Bundle
похож на тот, который возвращается классом фреймворка. Активность должна существовать в манифесте вашего приложения, и вам нужно будет указать среде выполнения вашего эмулятора Dalvik разрешить замену classpath (проверьте это, эта и эта ссылки) следующей командной строкой:
adb shell setprop dalvik.vm.dexopt-flags v=n,o=v
adb shell stop installd
adb shell start installd
И выполнить ваши тесты.
У меня была похожая проблема при тестировании камеры, и она подробно обсуждается на форуме эспрессо.
Похоже, что вы должны работать в корневом представлении, которое в вашем случае "сборщик учетных записей". Попробуйте это:
public void testAccountPicker(){
onView(withText("Choose an account"))
.inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView()))))
.check(matches(isDisplayed()));
}
Есть несколько способов проверить это с помощью Espresso Intents https://google.github.io/android-testing-support-library/docs/espresso/intents/
Вы можете убедиться, что Намерение было отправлено, чтобы открыть средство выбора учетной записи, используя синтаксис предназначенный (). Вы также можете проверить поведение вашей деятельности с помощью возвращенного результата из средства выбора, используя синтаксис intending(). ResponseWith().
Если вы действительно хотите взаимодействовать со сборщиком напрямую, вы можете использовать API UIAutomator: https://developer.android.com/topic/libraries/testing-support-library/index.html
UIAumator может использоваться внутри тестов эспрессо.