如何在CameraX的UI测试中注入假图像作为相机帧源?
CameraX假图像注入UI测试实现方案
针对使用CameraX图像分析+预览用例的场景,要在Espresso/UI Automator测试中注入假图像并验证输出,可按以下步骤实现:
1. 添加测试依赖
在模块级build.gradle中引入CameraX测试及UI测试相关依赖:
androidTestImplementation "androidx.camera:camera-testing:1.3.0" androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" androidTestImplementation "androidx.test.uiautomator:uiautomator:2.2.0"
2. 替换CameraX相机提供者
在测试类中,使用TestCameraProviderConfigurationRule将默认相机替换为FakeCameraProvider,以此接管相机输出:
@RunWith(AndroidJUnit4::class) class CameraXFakeImageTest { @get:Rule val cameraProviderRule = TestCameraProviderConfigurationRule( CameraProviderConfiguration.Builder() .setCameraProviderFactory(FakeCameraProviderFactory()) .build() ) // 测试方法实现 }
3. 生成适配的假ImageProxy
创建符合预览和分析用例格式要求的假图像,用CameraX测试工具将Bitmap转换为ImageProxy:
private fun createFakeImageProxy(): ImageProxy { // 生成测试Bitmap(示例为红色背景图) val bitmap = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888) bitmap.eraseColor(Color.RED) // 转换为CameraX分析用的ImageProxy(格式需与应用配置一致) return FakeImageUtil.createImageProxy(bitmap, ImageFormat.YUV_420_888) }
4. 注入假图像并验证输出
通过FakeCamera将假图像发送到绑定的预览和分析用例,分别验证预览可见性和分析结果:
@Test fun testFakeImageInPreviewAndAnalysis() { // 启动相机界面 val scenario = launchActivity<CameraActivity>() // 获取FakeCamera实例 val fakeCamera = cameraProviderRule.provider.unbindAll()[0] as FakeCamera val fakeImage = createFakeImageProxy() // 发送假图像到所有绑定用例 fakeCamera.sendImage(fakeImage) // 验证预览显示:通过UI Automator截取预览View截图,检查像素特征 val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) val previewView = device.findObject(By.res("com.your.package:id/preview_view")) val screenshot = previewView.takeScreenshot() assertEquals(Color.RED, screenshot.getPixel(320, 240)) // 验证图像分析结果:观察应用暴露的LiveData,确认分析回调收到假图像 scenario.onActivity { activity -> activity.getResultLiveData().observeForever { result -> assertNotNull(result) assertEquals(640, result.width) } } }
5. 应用层适配改造
为让测试能捕获图像分析结果,需在应用的图像分析回调中暴露可观察的结果:
// CameraActivity代码片段 private val analysisResultLiveData = MutableLiveData<ImageAnalysisResult>() private val imageAnalyzer = ImageAnalysis.Analyzer { imageProxy -> // 执行自定义图像分析逻辑 val result = processImageContent(imageProxy) analysisResultLiveData.postValue(result) imageProxy.close() } // 提供给测试获取结果的方法 fun getResultLiveData(): LiveData<ImageAnalysisResult> = analysisResultLiveData
核心注意事项
- 假图像格式必须与应用中预览、分析用例配置的格式一致(如YUV_420_888),避免格式不兼容问题。
- 预览验证可通过截图像素检查、Espresso视图匹配器实现;分析结果验证依赖应用层暴露的可观察数据。
- 确保
FakeCameraProvider完全替换默认相机,否则真实相机仍会启动,干扰测试。
内容的提问来源于stack exchange,提问作者Shreyas Patil
相关产品推荐
相关产品推荐

