如何在android studio中为PickVisualMediaRequest编写测试?

问题描述 投票:0回答:1

我的应用程序中有一个片段要求用户上传图像。如何编写在模拟设备上运行并从弹出窗口中选择图像的 Junit 测试?我还想知道是否有办法在我的测试运行之前将图像上传到虚拟设备中,以确保在手机图库中没有任何照片的情况下测试也能运行?

我尝试过使用UiDevice,但我无法弄清楚。

java android testing junit4
1个回答
0
投票

好吧,我可能有些不合时宜,但我正在解决一些类似的问题,这就是我所做的。

为了提供简要说明,以下代码并不是从 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))
© www.soinside.com 2019 - 2024. All rights reserved.