Espresso 和 Android 联系人选择器
Posted
技术标签:
【中文标题】Espresso 和 Android 联系人选择器【英文标题】:Espresso and Android contact picker 【发布时间】:2015-02-19 18:45:46 【问题描述】:我尝试使用 Espresso 的 android 联系人选择器添加联系人,但这不起作用。
这是调用联系人选择器的命令:
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, RC_PICK_CONTACT);
当我运行 Espresso 测试时,会显示联系人选择器。好的,现在我尝试通过显示名称(例如“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());
这两种方法都没有成功。如前所述,显示了联系人选择器,但没有选择任何内容。
有什么想法吗?
【问题讨论】:
你现在有一个完整的答案,如果它对你有用,请告诉我们,如果它有帮助不要忘记接受它。 【参考方案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;
【讨论】:
模拟的意图对我不起作用。这大概是因为我用来调出联系人选择器的意图。我用“new Intent(Intent.ACTION_PICK)”创建意图,因此模拟意图的方法是“intending(hasAction(Intent.ACTION_PICK)).respondWith(result);”。以上是关于Espresso 和 Android 联系人选择器的主要内容,如果未能解决你的问题,请参考以下文章