继承AndroidJUnitRunner后GrandPermissionRule失效,测试遇权限弹窗阻塞如何解决?
我之前也碰到过完全一样的情况!自从自定义了AndroidJUnitRunner替换默认实现后,原本好好的GrandPermissionRule突然就不管用了,测试直接被权限弹窗卡住,简直头疼。
问题原因
本质上是自定义Runner改变了测试应用的初始化流程:GrandPermissionRule通常依赖默认AndroidJUnitRunner的内部钩子来自动处理权限授予,但当你重写newApplication方法替换测试Application后,这个钩子的触发逻辑被打断了,导致规则无法正常生效,权限弹窗自然就弹出来了。
可行的修复方案
方案1:用AndroidX Test官方的权限规则替代GrandPermissionRule
官方的GrantPermissionRule和自定义Runner的兼容性更好,毕竟是同一个测试框架体系下的组件。直接替换你的权限规则即可:
import androidx.test.rule.GrantPermissionRule class YourTestClass { @get:Rule val permissionRule = GrantPermissionRule.grant( android.Manifest.permission.CAMERA, android.Manifest.permission.WRITE_EXTERNAL_STORAGE // 加上你需要的所有权限 ) // 你的测试方法... }
这个方案最省心,基本不会有兼容性问题。
方案2:在自定义Runner中手动授予权限
如果你一定要保留GrandPermissionRule,可以在自定义Runner的onStart方法中手动调用权限授予逻辑,抢在测试执行前把权限搞定:
class MockTestRunner : AndroidJUnitRunner() { @Throws( InstantiationException::class, IllegalAccessException::class, ClassNotFoundException::class ) override fun newApplication(cl: ClassLoader, className: String, context: Context): Application { return super.newApplication(cl, TestApplication::class.java.name, context) } override fun onStart() { super.onStart() // 列出所有测试需要的权限 val requiredPermissions = arrayOf( android.Manifest.permission.CAMERA, android.Manifest.permission.WRITE_EXTERNAL_STORAGE ) // 强制授予权限 grantPermissions(requiredPermissions, true) } }
这里的grantPermissions是AndroidJUnitRunner自带的方法,能直接给测试应用授予权限,跳过弹窗。
方案3:检查TestApplication的初始化逻辑
如果你的TestApplication重写了onCreate或者其他生命周期方法,看看有没有逻辑会干扰权限请求(比如禁用弹窗、修改权限策略)。确保测试Application在初始化时没有破坏测试框架的权限处理流程。
总结
优先推荐方案1,用官方权限规则,稳定性最高;如果有特殊需求必须用GrandPermissionRule,方案2的手动授权也能解决问题。
内容的提问来源于stack exchange,提问作者Dawid Hyzy

