我尝试使用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());
两种方法都没有成功。如前所述,显示了联系人选择器,但未选择任何内容。
有什么想法吗?
答案 0 :(得分:2)
您遇到的是正常行为,因为联系人选择器属于外部活动,其用户界面无法操作。试图断言任何东西都会导致测试停顿一段时间并最终以
结束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;
}