Questa è la prima volta che utilizzo gli intenti espresso, ho seguito IntentsBasicSamle fornito nel progetto di test Android ma non risolto.Come disattivare l'intento di selezionare le immagini utilizzando gli intenti di Espresso?
Nella mia app ho un'attività in cui l'utente seleziona più immagini e quindi le immagini restituite sono mostrate nella griglia, Ora usando gli intenti espresso voglio prendere in giro questo senza andare al selezionatore di immagini effettivo e restituire ogni volta le immagini specificate.
Nessun errore, ma ancora si apre la finestra di scelta delle immagini quando eseguo il test. Sento che sto sbagliando, ma non capisco come funziona.
Sto testando utilizzando apk.
Questo è il modo in foto si chiama raccoglitrice
codice App
Questo è come mi chiamo selezionare le immagini intenti e il risultato è gestito in 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);
Testing Codice
@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);
}
}