当imageuri作为额外的传递时,Espresso测试相机意图

我需要通过在意图额外提供的路径创建一个图像文件存根相机意图。 意式浓缩咖啡只能以活动结果回应。 我在哪里可以执行操作来创建文件在传递路径从意图额外。

代码启动相机

File destination = new File(Environment.getExternalStorageDirectory(), "app_name" + System.currentTimeMillis() + ".jpg");

imageUri = FileProvider.getUriForFile(getApplicationContext(),getApplicationContext()。getPackageName()+“.fileprovider”,destination); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);

startActivityForResult(intent,AppConstants.REQUEST_CODE_CAMERA);

代码测试中的stubbing意图

Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, null); intending(hasAction(MediaStore.ACTION_IMAGE_CAPTURE)).respondWith(result);

您需要创建一个IntentCallback来拦截Uri值并在那里保存一个示例图像。

样品在Kotlin

  intentCallback = IntentCallback { if (it.action == "android.media.action.IMAGE_CAPTURE") { it.extras.getParcelable<Uri>("output").run { val inStream = Resources.getResource(sampleImageFileName).openStream() val outStream = activity.contentResolver.openOutputStream(this) ByteStreams.copy(inStream, outStream) } } } 

您需要在意图触发事件之前注册您的回调

  IntentMonitorRegistry.getInstance().addIntentCallback(intentCallback) 

最后不要忘记取消注册

  IntentMonitorRegistry.getInstance().removeIntentCallback(intentCallback) 

伊斯梅尔答案是完美的。 对于那些在Java中寻找解决方案,在这里。

 intending(hasAction(MediaStore.ACTION_IMAGE_CAPTURE)).respondWith( new Instrumentation.ActivityResult(Activity.RESULT_OK, null)); IntentCallback intentCallback = new IntentCallback() { @Override public void onIntentSent(Intent intent) { if (intent.getAction().equals("android.media.action.IMAGE_CAPTURE")) { try { Uri imageUri = intent.getParcelableExtra(MediaStore.EXTRA_OUTPUT); Context context = InstrumentationRegistry.getTargetContext(); Bitmap icon = BitmapFactory.decodeResource( context.getResources(), R.mipmap.ic_launcher); OutputStream out = getTargetContext().getContentResolver().openOutputStream(imageUri); icon.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (IOException e) { GenericUtility.handleException(e); } } } }; IntentMonitorRegistry.getInstance().addIntentCallback(intentCallback); //Perform action here onView(withId(R.id.tv_take_photo)).perform(click());