模拟相机Intent for layerhq / atlas

时间:2016-06-08 16:16:37

标签: android-testing android-espresso

我正在尝试使用layerhq/Atlas-Andorid模拟相机在聊天期间发送图像的意图。以下使用espresso模拟相机意图的代码工作正常,除了Atlas抛出文件不存在错误(原因解释如下)。

Bundle bundle = new Bundle();
Bitmap x = BitmapFactory.decodeResource(intentsRule.getActivity().getResources(), R.drawable.accolade_avatar);
bundle.putParcelable("data", x);
Intent result = new Intent();
result.putExtras(bundle);
            intending(hasAction(MediaStore.ACTION_IMAGE_CAPTURE)).respondWith(new Instrumentation.ActivityResult(Activity.RESULT_OK, result));
clickItem(MessagePage.attachmentButton);
clickItem(MessagePage.cameraButton);

以下是相机意图的图层代码。

private void startCameraIntent(Activity activity) {
    String fileName = "cameraOutput" + System.currentTimeMillis() + ".jpg";
    File file = new File(getContext().getExternalFilesDir(android.os.Environment.DIRECTORY_PICTURES), fileName);
    mPhotoFilePath.set(file.getAbsolutePath());
    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    final Uri outputUri = Uri.fromFile(file);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
    activity.startActivityForResult(cameraIntent, ACTIVITY_REQUEST_CODE);
}

问题在线

mPhotoFilePath.set(file.getAbsolutePath());

我需要将它设置为一些预先存在的文件路径,如

mPhotoFilePath.set("/storage/DCIM/camera/image.jpg");

我无法修改layer-atlas代码。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

为了获得完整大小的捕获图像,捕获android中的图像意图与输出路径一起使用,这意味着您需要为Camera保存捕获的图像提供文件路径, 见https://developer.android.com/training/camera/photobasics.html
为了使用Espresso在android测试中测试这个流程,我建议伪造intent的调用者提供的输出文件(layer-atlas代码)。 所以你需要做的是获取调用者提供的路径并将模拟图像保存在那里。 据我所知,espresso-intents不支持它,但使用浓缩咖啡相对容易做到,这是一个代码示例:

    //stub intent handling for retreiving RESULT_OK status back
    IntentStubberRegistry.load(new IntentStubber() {
        @Override
        public Instrumentation.ActivityResult getActivityResultForIntent(Intent intent) {
            Intent resultIntent = new Intent();
            return new Instrumentation.ActivityResult(Activity.RESULT_OK, resultIntent);
        }
    });
    IntentCallback intentCallback = new IntentCallback() {
        @Override
        public void onIntentSent(Intent intent) {
            //extract output path for captured image from intent
            Uri uriToSaveImage = intent.getParcelableExtra(MediaStore.EXTRA_OUTPUT);
            //save ready-made mock image to the provided Uri
            saveImageToUri(test.R.raw.mockedCapturedImage, uriToSaveImage);
        }
    }
    IntentMonitorRegistry.getInstance().addIntentCallback(intentCallback);

    <click triggering code >

    IntentMonitorRegistry.getInstance().removeIntentCallback(intentCallback);