mue*_*flo 13 android unit-testing robolectric android-permissions android-6.0-marshmallow
我想学习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;
}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止写的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);
}
}
Run Code Online (Sandbox Code Playgroud)
第一个Assert工作(没有授予权限).但是在通过ShadowApplication授予所有权限后,它们仍会在下一个Assert中被拒绝.
我认为PictureActivity创建的with Robolectric.buildActivity()不使用ShadowApplication进行权限检查.但是PictureActivity.getApplication()没有给我ShadowApplication打电话grantPermissions.我该怎么测试呢?
我是新手Robolectric并在Android上进行单元测试...所以如果有任何其他框架可以让这更容易/可能:我愿意接受建议.
Jav*_*209 14
而不是使用ActivityCompat我正在使用ContextCompat.checkSelfPermission()哪个接收上下文,所以发送上下文的模拟并返回授予的权限,这对我们有用:
代替:
ActivityCompat.checkSelfPermission(activity, permission);
Run Code Online (Sandbox Code Playgroud)
使用
ContextCompat.checkSelfPermission(context, permission);
Run Code Online (Sandbox Code Playgroud)
然后在您的文本中,您可以直接将模拟发送到您的hasPermissions方法并将结果存根为:
Context context = mock(Context.class);
when(context.checkPermission(eq("YOUR_PERMISSION"),anyInt(),anyInt())).thenReturn(
PackageManager.PERMISSION_GRANTED);
Run Code Online (Sandbox Code Playgroud)
Gen*_*eti 11
您的问题是您使用的是其他应用程序来授予权限,而不是您自己的权限.
而不是这个:
application = new ShadowApplication();
Run Code Online (Sandbox Code Playgroud)
你应该得到你的应用程序的阴影,像这样:
application = Shadows.shadowOf(activity.getApplication());
Run Code Online (Sandbox Code Playgroud)
从 Robolectric 4.2 开始,您可以使用:
Application application = ApplicationProvider.getApplicationContext();
ShadowApplication app = Shadows.shadowOf(application);
app.grantPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5078 次 |
| 最近记录: |