当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());