[英]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.