【问题标题】:Android Robolectric unit test for Marshmallow PermissionHelper棉花糖 PermissionHelper 的 Android Robolectric 单元测试
【发布时间】:2016-05-04 01:07:23
【问题描述】:

我想学习 Robolectric,以便在 Android Marshmallow 应用上使用它进行单元测试。我用一些方法写了一个PermissionHelper,使权限处理更容易一些。为了开始对这个类进行单元测试,我尝试测试最简单的方法:

public static boolean hasPermissions(Activity activity, String[] permissions) {
    for (String permission : permissions) {
        int status = ActivityCompat.checkSelfPermission(activity, permission);
        if (status == PackageManager.PERMISSION_DENIED) {
            return false;
        }
    }
    return true;
}

这是我目前编写的 Robolectric 测试:

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class PermissionHelperTest {

    private PermissionHelper permissionHelper;
    private ShadowApplication application;

    @Before
    public void setup() {
        PictureActivity activity = Robolectric.buildActivity(PictureActivity.class).get();
        permissionHelper = new PermissionHelper(activity, activity, 1);
        application = new ShadowApplication();
    }

    @Test
    public void testHasPermission() throws Exception {
        String[] permissions = new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE};
        boolean hasPermissions = permissionHelper.hasPermissions(permissions);
        Assert.assertEquals(false, hasPermissions);

        application.grantPermissions(permissions);
        hasPermissions = permissionHelper.hasPermissions(permissions);
        Assert.assertEquals(true, hasPermissions);
    }
}

第一个 Assert 有效(未授予权限)。但是在通过 ShadowApplication 授予所有权限后,它们仍然在下一个 Assert 中被拒绝。

我认为使用Robolectric.buildActivity() 创建的PictureActivity 没有使用ShadowApplication 进行权限检查。但是PictureActivity.getApplication() 没有给我ShadowApplication 来调用grantPermissions。我该如何测试?

我是 Robolectric 和 Android 单元测试的新手......所以如果有任何其他框架可以让这更容易/可能:我愿意接受建议。

【问题讨论】:

    标签: android unit-testing robolectric android-permissions android-6.0-marshmallow


    【解决方案1】:

    您的问题是您使用不同的应用程序授予权限,而不是您自己的。

    而不是这个:

    application = new ShadowApplication();
    

    你应该得到你的应用程序的影子,像这样:

    application = Shadows.shadowOf(activity.getApplication());
    

    【讨论】:

    【解决方案2】:

    我没有使用ActivityCompat,而是使用接收上下文的ContextCompat.checkSelfPermission(),因此发送上下文的模拟并返回授予的权限,这对我们有用:

    代替:

    ActivityCompat.checkSelfPermission(activity, permission);
    

    使用

    ContextCompat.checkSelfPermission(context, permission);
    

    然后在您的文本中,您可以将模拟直接发送到您的 hasPermissions 方法并将结果存根为:

    Context context = mock(Context.class);
    when(context.checkPermission(eq("YOUR_PERMISSION"),anyInt(),anyInt())).thenReturn(
        PackageManager.PERMISSION_GRANTED);
    

    【讨论】:

    • 这部分是 Mockito 还是 Robolectric
    • 哪一部分? ContextCompat 是 Android 支持包的一部分,其余的是常规 mockito
    【解决方案3】:

    从 Robolectric 4.2 开始,您可以使用:

    Application application = ApplicationProvider.getApplicationContext();
    ShadowApplication app = Shadows.shadowOf(application);
    app.grantPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多