Po raz pierwszy używam ekspresów do espresso, podążałem za IntentsBasicSamle dostarczonych w projekcie do testowania Androida, ale nie rozwiązano.Jak wybierać obrazy według intencji espresso?
W mojej aplikacji mam aktywność, w której użytkownik wybiera wiele obrazów, a następnie zwrócone obrazy są wyświetlane w widoku siatki, Teraz za pomocą intencji espresso chcę drwić to bez przechodzenia do rzeczywistego selektora zdjęć i zwracać niektóre określone obrazy za każdym razem.
Brak błędu, ale nadal otwiera okno wyboru obrazu po uruchomieniu testu. Czuję, że robię to źle, ale nie rozumiem, jak to działa.
Testuję używając apk.
ten sposób zdjęcie kompletacji nazywa
kod App
ten sposób wzywam wybrać obrazy Intent i wynik jest obsługiwana w onActivityResult.
if (ApiUtils.checkApiLevel(18)) {
//API18+
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
}
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, getActivity().getString(R.string.fragment_image_selection_select_picture)), 1);
Kod Testowanie
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ImagesTests {
private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.company.recorder.RecorderActivity";
private static Class<? extends Activity> activityClass;
private ServiceValidatorIdlingResource serviceValidatorIdlingResource;
static {
try {
activityClass = (Class<? extends Activity>) Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
/**
* Change espresso default view idling time
* so that test can wait for long time
*/
@Before
public void registerWaitService() {
EspressoSolo.setIdlingResourceTimeout(30);
Instrumentation.ActivityResult result = createImageCaptureActivityResultStub();
// Stub the Intent.
intending(hasAction(Intent.ACTION_GET_CONTENT)).respondWith(result);
//For API 18 and above
intending(hasAction(Intent.EXTRA_ALLOW_MULTIPLE)).respondWith(result);
//intending(not(isInternal())).respondWith(result);
}
private Instrumentation.ActivityResult createImageCaptureActivityResultStub() {
// Put the drawable in a bundle.
Bundle bundle = new Bundle();
Uri imageUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
InstrumentationRegistry.getTargetContext().getPackageName()+ '/' +
InstrumentationRegistry.getTargetContext().getResources().getResourceTypeName(R.drawable.abc_ic_menu_copy_mtrl_am_alpha) + '/' +
InstrumentationRegistry.getTargetContext().getResources().getResourceEntryName(R.drawable.abc_ic_menu_copy_mtrl_am_alpha));
Parcelable parcelable = (Parcelable)imageUri;
ArrayList<Parcelable> parcels = new ArrayList<>();
parcels.add(parcelable);
bundle.putParcelableArrayList(Intent.EXTRA_STREAM, parcels);
// Create the Intent that will include the bundle.
Intent resultData = new Intent();
resultData.putExtras(bundle);
// Create the ActivityResult with the Intent.
return new Instrumentation.ActivityResult(Activity.RESULT_OK, resultData);
}
@Rule
public IntentsTestRule<?> mIntentsRule = new IntentsTestRule<>(
activityClass);
/**
* In this test images are taken during the recording
* add the images taken during the recording through add photos card
* displayed after recording is stopped.
*
* @throws Exception
*/
@Test
public void testAddImagesFromPhotosCard() throws Exception {
onView(withId(Recorder.getId("recorderpage_record"))).perform(click());
Log.d("called", "other package");
IdlingResource idlingResource0 = new RecordingWaitIdlingResource(5000);
Espresso.registerIdlingResources(idlingResource0);
Log.d("called", "other package");
onView(withId(Recorder.getId("card_topText"))).perform(click());
Espresso.unregisterIdlingResources(idlingResource0);
onView(withId(Recorder.getId("recorderpage_stop"))).perform(click());
//Log.d("called", "other package");
IdlingResource idlingResource2 = new RecordingWaitIdlingResource(2000);
Espresso.registerIdlingResources(idlingResource2);
onView(withId(Recorder.getId("recorderpage_statustext")))
.perform(click());
Espresso.unregisterIdlingResources(idlingResource2);
onView(withId(Recorder.getId("pager"))).perform(swipeLeft());
onData(allOf()).onChildView(withId(Recorder.getId("recordsOverflow"))).
atPosition(0).perform(click());
IdlingResource idlingResource3 = new RecordingWaitIdlingResource(2000);
Espresso.registerIdlingResources(idlingResource3);
onData(allOf()).onChildView(withId(Recorder.getId("recordsOverflow"))).
atPosition(0).perform(click());
Espresso.unregisterIdlingResources(idlingResource3);
onView(withText("Add an image")).perform(click());
Instrumentation.ActivityResult result = createImageCaptureActivityResultStub();
intending(toPackage("com.android.documentsui")).respondWith(result);
/* I actually dont know which preinstalled app is opened by intent, I saw this com.android.documentsui, also tried with photos and gallery package names */
intending(toPackage("com.android.documentsui.DocumentsActivity")).respondWith(result);
intending(hasAction(Intent.ACTION_GET_CONTENT)).respondWith(result);
//Now click on add images
onView(withId(Recorder.getId("menu_fragment_imagewizard_selection_add"))).perform(click());
//Just waits for 2seconds
IdlingResource idlingResource4 = new RecordingWaitIdlingResource(2000);
Espresso.registerIdlingResources(idlingResource4);
onView(withText("Add images")).perform(click());
Espresso.unregisterIdlingResources(idlingResource4);
}
}