Android Robolectric unit test для 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
on. Как я могу проверить это?
Я новичок в Robolectric и модульном тестировании на Android... так что если есть какие-то другие рамки, которые делают это проще/возможно: я открыт для предложений.
Ответы
Ответ 1
Из Robolectric 4.2 вы можете использовать:
Application application = ApplicationProvider.getApplicationContext();
ShadowApplication app = Shadows.shadowOf(application);
app.grantPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE);
Ответ 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);
Ответ 3
Ваша проблема заключается в том, что вы используете другое приложение для предоставления разрешений, а не для своих собственных.
Вместо этого:
application = new ShadowApplication();
вы должны получить тень приложения , например:
application = Shadows.shadowOf(activity.getApplication());