10

Android Marshmallow uygulamasında birim testleri için Robolectric'i kullanmayı öğrenmek istiyorum. İzin vermek biraz daha kolay hale getirmek için bazı yöntemleri ile bir PermissionHelper yazdım. (Android Marshmallow PermissionHelper için Robolectric birim testi

@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); 
    } 
} 

ilk belirt çalışır:

İşte
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; 
} 

şimdiye kadar yazdım Robolectric testidir: bu sınıf için birim testleri ile başlamak için, ben en basit yöntemi test etmek çalışıyorum izin verilmedi). Ancak ShadowApplication üzerinden tüm izinleri verdikten sonra, bir sonraki Assert'te hala reddediliyorlar.

Robolectric.buildActivity() ile oluşturulan PictureActivity, izin denetimleri için ShadowApplication kullanmadığını düşünüyorum. Ancak PictureActivity.getApplication(), grantPermissions numaralı telefonu aramak için bana ShadowApplication vermez. Bunu nasıl test edebilirim?

Android'de Robolectric ve unit testlerinde yeniyim ... bu yüzden daha kolay/mümkün kılan başka bir çerçeve varsa: Önerilere açığım.

cevap

6

Sorununuz, kendiniz değil, izinleri vermek için farklı bir uygulama kullanıyor olmanızdır. Bunun yerine

: Eğer böyle senin uygulamanın bir gölge, almalısınız

application = new ShadowApplication(); 

: Onun yerine bir bağlam aldığı ContextCompat.checkSelfPermission() kullanıyorum ActivityCompat kullanmanın

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

Evet, bu çalıştı! Teşekkür ederim. Değişiklikten sonra AndroidHttpClient'in eksik olduğu başka bir hata aldım, ancak burada tartışılan kolay bir çözüm: https://github.com/robolectric/robolectric/issues/1862 – muetzenflo

7

, Bu nedenle, bağlamın bir alayını gönderin ve verilen izin verilsin, bu bizim için iştir:

Onun yerine:

ActivityCompat.checkSelfPermission(activity, permission); 

kullanım

ContextCompat.checkSelfPermission(context, permission); 

sonra metinde size hasPermissions yönteme doğrudan bir taklidini gönderebilir ve olarak sonucu saplama:

Context context = mock(Context.class); 
when(context.checkPermission(eq("YOUR_PERMISSION"),anyInt(),anyInt())).thenReturn(
    PackageManager.PERMISSION_GRANTED); 
+0

** Mockito ** veya ** Robolectric'in bu bölümü ** –

+1

Hangi bölüm? 'ContextCompat' Android destek paketinin bir parçasıdır ve gerisi normal mockitodur – JavierSP1209