2014-02-11 4 views
6

У меня возникли проблемы с проведением контрольно-измерительного теста с использованием эспрессо. У меня есть активность, когда сбор учетных записей всплывает при запуске приложения (основное действие). Если клик нажимает на отмену (в диалоговом окне), сборщик снова появляется; Если пользователь нажимает на добавление, результат будет получен по результату активности.Android эспрессо и сборщик учетных записей

Я не знаю, как создать простой тест с эспрессо, который будет включать этот сборщик. Когда я создаю тест Instrumentation с MainActivity, я получил это сообщение: Никакой деятельности в стадии не ВОЗОБНОВЛЕННАЯ ...

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())); 
    } 
} 

имело ли кто-нибудь подобную проблему?

Thanx за ваши ответы заранее.

+0

Не могли бы вы опубликовать методы жизненного цикла своей деятельности? – Bolhoso

+0

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); ' И логика для выбранной учетной записи. Другие методы жизненного цикла не изменяются. –

ответ

1

Кажется, что вы должны работать в корневом представлении, которое в вашем случае является «сборщиком учетных записей». Попробуйте это:

public void testAccountPicker(){ 
    onView(withText("Choose an account")) 
     .inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView())))) 
     .check(matches(isDisplayed())); 
} 
+0

Привет, Денис, я до сих пор получил сообщение об ошибке: «Никаких действий в стадии RESUMED. Забыли ли вы запустить эту активность. (Test.getActivity() или подобное)?» –

+0

Хорошо, у вас нет собственного настраивающегося аккаунта в приложении, но у него есть аккаунт Google? В этом случае я думаю, что вы не можете справиться с этим, поскольку вы находитесь за пределами своего приложения. Задайте этот вопрос в андроид-тест-наборе - обсудите группу Google - https://groups.google.com/forum/#!forum/android-test-kit-discuss. – denys

+0

Да, вы правы. Я использую сборщик учетных записей google, но не свой. Thanx для ответа. –

2

Это сложный вопрос :). Проблема здесь в том, что после того, как поток покинет ваше приложение (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

+1

Как всегда в «нужно сделать вчера», я некоторое время оставил тест на паузе. Но я понимаю, что вы предлагаете, попробуете это наверняка. Извините за поздний ответ. Thanx –

0

Есть несколько способов, которые вы могли бы быть в состоянии идти о тестировании это с помощью Эспрессо Intents https://google.github.io/android-testing-support-library/docs/espresso/intents/

Вы можете проверить, что Intent был отправлен, чтобы открыть сборщик учетных записей, используя назначенный() синтаксис. Вы также можете проверить поведение своей активности с результатом, полученным от сборщика, с помощью синтаксиса intending(). ResponseWith().

Если вы действительно хотите, чтобы взаимодействовать с подборщика непосредственно, вы можете быть в состоянии с помощью API UIAutomator: https://developer.android.com/topic/libraries/testing-support-library/index.html#UIAutomator

UIAutomator можно использовать внутри тестов Espresso.