簡體   English   中英

用於Marshmallow PermissionHelper的Android Robolectric單元測試

[英]Android Robolectric unit test for Marshmallow PermissionHelper

我想學習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上進行單元測試...所以如果有任何其他框架可以讓這更容易/可能:我願意接受建議。

我沒有使用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);

您的問題是您使用的是其他應用程序來授予權限,而不是您自己的權限。

而不是這個:

application = new ShadowApplication();

你應該得到你的應用程序的陰影,像這樣:

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

從Robolectric 4.2您可以使用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM