Това, което изпитвате, е нормално поведение, тъй като инструментът за избор на контакт принадлежи на външна дейност, чийто потребителски интерфейс не може да бъде манипулиран. Опитът да се твърди нещо ще доведе до забавяне на тестовете за известно време и завършване с a
android.support.test.espresso.NoActivityResumedException: Няма дейности в етап ВЪЗОБНОВЕН. Забравихте ли да стартирате дейността. (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