2

Espresso の Android 連絡先ピッカーで連絡先を追加しようとしましたが、うまくいきません。

これは、連絡先ピッカーを呼び出すコマンドです。

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

Espresso テストを実行すると、連絡先ピッカーが表示されます。OK、表示名 (「Jake」など) で特定の連絡先エントリを選択しようとしました。残念ながら、これを達成する方法がわかりません。私は次のことを試しました:

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

私もこのバリエーションを試しました:

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

どちらのアプローチでも成功しません。すでに述べたように、連絡先ピッカーが表示されますが、何も選択されていません。

何か案が?

4

1 に答える 1

3

連絡先ピッカーは、ユーザー インターフェイスを操作できない外部アクティビティに属しているため、発生しているのは通常の動作です。何かをアサートしようとすると、テストがしばらく停止し、最終的に

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;
    }
于 2015-04-28T15:45:20.293 に答える