Android Marshmallow引入了新的权限管理机制,需要在运行时检查特定的权限,这意味着需要根据用户是否拒绝或允许访问提供不同的流程。
由于我们使用Espresso在应用程序上运行自动化UI测试,因此如何模拟或更新权限状态以测试不同情景呢?
Android Marshmallow引入了新的权限管理机制,需要在运行时检查特定的权限,这意味着需要根据用户是否拒绝或允许访问提供不同的流程。
由于我们使用Espresso在应用程序上运行自动化UI测试,因此如何模拟或更新权限状态以测试不同情景呢?
如果需要允许权限,我认为最简单的方法是在需要该权限的测试中直接使用Barista的PermissionGranter.allowPermissionsIfNeeded(Manifest.permission.GET_ACCOUNTS)
。
我已经实现了一个解决方案,利用包装类、重写和构建变量配置。这个解决方案很长,可以在这里找到:https://github.com/ahasbini/AndroidTestMockPermissionUtils。
它还没有打包成sdk,但主要思路是覆盖ContextWrapper.checkSelfPermission
和ActivityCompat.requestPermissions
的功能,以便操纵并返回模拟结果,欺骗应用程序进入不同的测试场景,例如:权限被拒绝,因此应用程序请求并最终获得授权。即使应用程序一直拥有该权限,也会出现这种情况,但这个想法是通过重写实现来欺骗模拟结果。
此外,该实现还有一个名为PermissionRule
的TestRule
类,可用于测试类中,以便轻松模拟所有条件,无缝测试权限。还可以进行断言,例如确保应用程序已调用requestPermissions()
。
我知道已经有一个答案被接受了,但是,与其一遍又一遍地建议使用if
语句,另一个更优雅的方法是在你想要针对特定操作系统版本进行实际测试时,可以采取以下方法:
@Test
fun yourTestFunction() {
Assume.assumeTrue(Build.VERSION.SDK_INT >= 23)
// the remaining assertions...
}
assumeTrue
函数,测试将停止并被忽略,我假设这正是你在设备预SDK 23上执行测试时想要的结果。