10

Voglio imparare Robolectric per utilizzarlo per i test unitari su un'app Android Marshmallow. Ho scritto uno PermissionHelper con alcuni metodi per rendere la gestione dei permessi un po 'più semplice. Per iniziare con il test di unità per questa classe, sto cercando di testare il metodo più semplice:Test dell'unità Robolectric Android per 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; 
} 

Ecco il test Robolectric che ho scritto finora:

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

Il primo Assert Works (nessun permesso concesso). Ma dopo aver concesso tutte le autorizzazioni tramite ShadowApplication, vengono comunque negati nel prossimo Assert.

Penso che lo PictureActivity creato con Robolectric.buildActivity() non stia utilizzando ShadowApplication per i controlli di autorizzazione. Ma PictureActivity.getApplication() non mi da un ShadowApplication per chiamare grantPermissions su. Come posso testarlo?

Sono nuovo di Robolectric e collaudo di unità su Android ... quindi se c'è qualche altra struttura che rende questo più facile/possibile: sono aperto a suggerimenti.

risposta

6

Il tuo problema è che stai utilizzando un'applicazione diversa per concedere le autorizzazioni, non le tue.

Invece di questo:

application = new ShadowApplication(); 

si dovrebbe ottenere l'ombra di dell'applicazione, in questo modo:

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

Sì, che ha funzionato! Grazie. Dopo la modifica ho ricevuto un altro errore che AndroidHttpClient manca, ma questa è una soluzione semplice discussa qui: https://github.com/robolectric/robolectric/issues/1862 – muetzenflo

7

Invece di usare ActivityCompat sto usando ContextCompat.checkSelfPermission() che riceve un contesto, quindi invia una simulazione del contesto e restituisci l'autorizzazione concessa, questo è lavoro per noi:

Invece di:

ActivityCompat.checkSelfPermission(activity, permission); 

uso

ContextCompat.checkSelfPermission(context, permission); 

poi nel testo è possibile inviare una finta direttamente al tuo metodo hasPermissions e stub il risultato come:

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

Questa parte di ** Mockito **, o ** Robolectric ** –

+1

Quale parte? 'ContextCompat' fa parte del pacchetto di supporto Android e il resto è un normale mockito – JavierSP1209

Problemi correlati