问题 用于Marshmallow PermissionHelper的Android Robolectric单元测试


我想学习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中被拒绝。

我认为 PictureActivity 用。创建 Robolectric.buildActivity() 没有使用ShadowApplication进行权限检查。但 PictureActivity.getApplication() 不给我一个 ShadowApplication 打电话 grantPermissions 上。我该怎么测试呢?

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


6924
2018-01-27 07:35


起源



答案:


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

而不是这个:

application = new ShadowApplication();

你应该得到一个阴影 你的 应用程序,像这样:

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

7
2018-02-08 09:19



是的,那很有效!谢谢。在更改之后,我得到了另一个AndroidHttpClient缺失的错误,但这是一个很容易解决的问题: github.com/robolectric/robolectric/issues/1862 - muetzenflo


答案:


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

而不是这个:

application = new ShadowApplication();

你应该得到一个阴影 你的 应用程序,像这样:

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

7
2018-02-08 09:19



是的,那很有效!谢谢。在更改之后,我得到了另一个AndroidHttpClient缺失的错误,但这是一个很容易解决的问题: github.com/robolectric/robolectric/issues/1862 - muetzenflo


而不是使用 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);

9
2018-06-08 14:07



是这部分的 的Mockito, 要么 Robolectric - Igor Ganapolsky
哪一部分? ContextCompat 是Android支持包的一部分,其余的是常规mockito - JavierSP1209