Средство выбора контактов для эспрессо и Android

Я пытаюсь добавить контакт с помощью средства выбора контактов Android от Espresso, но это не работает.

Это команда для вызова средства выбора контактов:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, RC_PICK_CONTACT);

Средство выбора контактов отображается, когда я запускаю тест Espresso. Хорошо, теперь я пытаюсь выбрать конкретную запись контакта по отображаемому имени (например, «Джейк»). К сожалению, я не знаю, как это сделать. Я пробовал следующее:

onData(withItemContent("Jake")).inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView())))).perform(click()); 

Я также пробовал этот вариант:

onView(withText("Jake")).inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView())))).perform(click());

Нет успеха с обоими подходами. Как уже упоминалось, средство выбора контактов отображается, но ничего не выбрано.

Есть идеи?


person Community    schedule 21.12.2014    source источник
comment
теперь у вас есть полный ответ, дайте нам знать, работает ли он для вас, и не забудьте принять его, если он полезен.   -  person appoll    schedule 29.04.2015


Ответы (1)


То, что вы испытываете, является нормальным поведением, поскольку средство выбора контактов принадлежит внешней активности, пользовательским интерфейсом которой нельзя управлять. Попытка утверждать что-либо приведет к тому, что тесты застопорятся на некоторое время и закончатся ошибкой.

android.support.test.espresso.NoActivityResumedException: на этапе RESUMED нет действий. Вы забыли запустить активность. (test.getActivity() или аналогичный)?

Однако поздоровайтесь с новорожденными Espresso-Intents, который здесь, чтобы спасти мою репутацию:

Используя предполагаемый API (двоюродный брат Mockito.when), вы можете предоставить ответ для действий, которые запускаются с помощью startActivityForResult.

ОБНОВЛЕНИЕ Ниже приведено мое текущее решение, которое отлично работает, но требует приличной очистки кода:

    @Test
    public void testContactPickerResult(){

        Intent resultData = new Intent();
        resultData.setData(getContactUriByName("Joah"));
        Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, resultData);

        intending(toPackage("com.google.android.contacts")).respondWith(result);

        onView(withId(R.id.contactPickerLauncher))
                .check(matches(isDisplayed()))
                .perform(click());

        onView(withId(R.id.pickedContact))
                .check(matches(withText(getContactNumberByName("Joah"))));
    }

В процессе запуска я обрабатывал входящее намерение с контактом Uri и делал с ним все, что необходимо.

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        TextView result = (TextView) findViewById(R.id.pickedContact);

        if (requestCode == 42 && resultCode == RESULT_OK){
            Uri contactUri = data.getData();             
            String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER};
            Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null);
            cursor.moveToFirst();
            int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            String number = cursor.getString(column);
            result.setText(number);
        }
    }

Кроме того, вспомогательные методы должны быть соответственно изменены:

public Uri getContactUriByName(String contactName) {
        Cursor cursor = mActivityRule.getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

        if (cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                String id = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                if (name.equals(contactName)) {
                    return Uri.withAppendedPath(ContactsContract.Data.CONTENT_URI, id);
                }
            }
        }
        return null;
    }
person appoll    schedule 28.04.2015
comment
Насмешливое намерение не сработало для меня. Это, по-видимому, из-за намерения, которое я использую, чтобы вызвать средство выбора контактов. Я создаю намерение с новым намерением (Intent.ACTION_PICK), и, соответственно, то, что работает, чтобы издеваться над намерением, — это намерение (hasAction (Intent.ACTION_PICK)). - person stevehs17; 03.11.2016