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());