junit 如何在Java/Kotlinandroidx UI中有条件地运行@Rule自动化

j13ufse2  于 2023-02-04  发布在  Java
关注(0)|答案(1)|浏览(100)

我正在为Android编写UI自动化,测试库中有一个方便的@Rule,可以让我抢先授予应用权限,这样在应用上运行UI测试时就不必处理权限对话框。
Android 13(sdk 33)中有一个名为“POST_NOTIFICATIONS”的新权限。我正在测试的应用使用了这一功能,但运行Android 12及更低版本的设备无法识别它。我有一个权限规则,如下所示:

@Rule
    @JvmField
    var grantPermissionRule: GrantPermissionRule =
        grant(
            "android.permission.ACCESS_FINE_LOCATION",
            "android.permission.POST_NOTIFICATIONS"
        )

当我在Android 13设备上运行测试时,它工作得很完美。但当我在Android 12设备上运行时,由于权限管理器试图请求一个不存在的权限,测试立即崩溃。这个未处理的异常来自google的内置测试库代码--GrantPermissionsRule.java in package androidx.test.rule当我如下所示更改代码以移除新权限时,它在Android 12上运行正常,但现在当我在Android 13设备上使用此代码时,会出现通知对话框。

@Rule
    @JvmField
    var grantPermissionRule: GrantPermissionRule =
        grant(
            "android.permission.ACCESS_FINE_LOCATION"
        )

我希望能够在Android 12和Android 13设备上运行测试,而不需要来回更改权限代码。那么我该如何解决这个问题呢?我对java/Kotlin的高级功能了解不多,但似乎没有办法将@Rule Package 在try/catch块中,这样我就可以处理异常并执行经过删节的代码块。这似乎不是一种让@Rule以Android设备版本号为条件的方法,这样我就可以在正确的时间使用正确的权限集。
我需要覆盖内置的androidx库吗?或者可能有一个花哨的Kotlin或Java东西我可以用来有条件地将POST_NOTIFICATIONS权限添加到我最终在@Rule中使用的权限集?我愿意接受建议。

uinbv5nw

uinbv5nw1#

试试看:

@Rule
    @JvmField
    var grantPermissionRule: GrantPermissionRule =
        if (Build.VERSION.SDK_INT >= 33) {
          grant(
              "android.permission.ACCESS_FINE_LOCATION",
              "android.permission.POST_NOTIFICATIONS"
          )
        } else {
          grant(
              "android.permission.ACCESS_FINE_LOCATION"
          )
        }

顺便说一句,除非这个规则需要var,否则我会使用val而不是var

相关问题