Как проверить, содержит ли intent (активность) строку в имени пакета (Espresso)?
Я тестирую свое приложение с помощью пользовательского интерфейса и хочу проверить, открывается ли приложение камеры.
Я сделал это с:
@Test
public void profileImageClickOpensCamera() {
mIntentsRule.getActivity().startActivity(new Intent(mIntentsRule.getActivity(), ProfileActivity.class));
onView(withId(R.id.circleProfileImage)).perform(click());
intended(toPackage("com.android.camera"));
}
Он работает нормально на большинстве устройств, однако, если я добавлю его на SAMSUNG Galaxy S8, в котором есть приложение com.sec.android.app.camera для камеры, тест не пройден.
У меня вопрос, как я могу проверить с помощью эспрессо, что пакет содержит слово "камера"?
Это не лучшее решение, потому что имя пакета приложения камеры устройства может быть любым, но даже лучше, чем я узнал.
Поэтому я хотел бы сделать что-то вроде:
intended(StringContains(toPackage("com.android.camera")));
Какие-либо предложения?
Заранее спасибо.
2 ответа
Вы можете проверить действие намерения вместо пакета.
Что-то вроде intended(hasAction(MediaStore.ACTION_IMAGE_CAPTURE))
или же intended(hasAction(equalTo(MediaStore.ACTION_IMAGE_CAPTURE)))
должно сработать.
У меня была такая же ситуация, и мне удалось решить ее следующим образом:
PackageManager packageManager = InstrumentationRegistry.getTargetContext().getPackageManager();
String pack = resultData.resolveActivity(packageManager).getPackageName();
intended(toPackage(pack));
В моей ситуации у меня было действие с кнопкой, которая открывает камеру, позволяет вам делать снимок и возвращается с ним в вашей деятельности. Полный код этого теста будет:
@Test
public void testCameraIntent() {
Bitmap icon = BitmapFactory.decodeResource(
InstrumentationRegistry.getTargetContext().getResources(),
R.drawable.husky);
// Build a result to return from the Camera app
Intent resultData = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
resultData.putExtra("data", icon);
Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, resultData);
PackageManager packageManager = InstrumentationRegistry.getTargetContext().getPackageManager();
String pack = resultData.resolveActivity(packageManager).getPackageName();
// Stub out the Camera. When an intent is sent to the Camera, this tells Espresso to respond
// with the ActivityResult we just created
intending(toPackage(pack)).respondWith(result);
// Now that we have the stub in place, click on the button in our app that launches into the Camera
onView(withId(R.id.btn_takePicture)).perform(click());
intended(toPackage(pack));
}
И вот результат:-) изображение с собакой Husky является локальным изображением, которое я настроил для отправки в своем пользовательском ActivityResult: