我的应用程序中有一个片段要求用户上传图像。如何编写在模拟设备上运行并从弹出窗口中选择图像的 Junit 测试?我还想知道是否有办法在我的测试运行之前将图像上传到虚拟设备中,以确保在手机图库中没有任何照片的情况下测试也能运行?
我尝试过使用UiDevice,但我无法弄清楚。
好吧,我可能有些不合时宜,但我正在解决一些类似的问题,这就是我所做的。
为了提供简要说明,以下代码并不是从 PickVisualMedia() 中选取图像的精确测试。但它的工作原理几乎与应有的一样。
首先创建 ActivityResultRegistry 来获取将更新视图的 Uri 和 viewModel。
然后像下面这样启动它可以触发 uri,因为应该在 ActiovityResultLauncher -> onResult(uri) 中调用。然后你可以调用函数来处理它并将其传递给viewModel。
// Mock ActivityResultRegistry
val mockRegistry = object : ActivityResultRegistry() {
override fun <I : Any?, O : Any?> onLaunch(
requestCode: Int,
contract: ActivityResultContract<I, O>,
input: I,
options: ActivityOptionsCompat?
) {
val result = Uri.parse("android.resource:///${R.drawable.}")
dispatchResult(requestCode, result as O)
}
}
val activity = composeTestRule.activity
val myViewModel = ViewModelProvider(activity).get(myViewModel::class.java)
val context = activity.applicationContext
// Register the image picker with the mock registry
val launcher = mockRegistry.register("key", ActivityResultContracts.PickVisualMedia()) { result: Uri? ->
// Handle the result here
if (result != null) {
val byteArray = uriToByteArray(
context = context,
uri = result,
)
if(byteArray != null){
myViewModel.setImage(byteArray)
}
}
}
launcher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))