Как проверить, содержит ли 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:

Другие вопросы по тегам