10

Ich möchte Robolectric lernen, um es für Unit Tests auf einer Android Marshmallow App zu verwenden. Ich schrieb eine PermissionHelper mit einigen Methoden, um Erlaubnisbehandlung ein wenig einfacher zu machen. Um mit Unit-Tests für diese Klasse zu beginnen, Ich versuche, die einfachste Methode zu testen:Android Robolectric Einheit Test für 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; 
} 

Hier ist der Robolectric Test, die ich bisher geschrieben:

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

Die erste Assert arbeitet (keine Erlaubnis gewährt). Aber nachdem alle Berechtigungen über die ShadowApplication erteilt wurden, werden sie im nächsten Assert noch immer abgelehnt.

Ich denke, dass die PictureActivity erstellt mit Robolectric.buildActivity() nicht die ShadowApplication für die Berechtigungsprüfungen verwendet. Aber PictureActivity.getApplication() gibt mir keine ShadowApplication um grantPermissions anzurufen. Wie kann ich das testen?

Ich bin neu in Robolectric und Komponententests auf Android ... also wenn es ein anderes Framework gibt, das dies einfacher/möglich macht: Ich bin offen für Vorschläge.

Antwort

6

Ihr Problem besteht darin, dass Sie eine andere Anwendung verwenden, um Berechtigungen zu erteilen, nicht Ihre eigenen.

Statt dessen:

application = new ShadowApplication(); 

Sie einen Schatten von Ihre Anwendung kommen sollten, wie folgt aus:

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

Ja, das hat geklappt! Vielen Dank. Nach der Änderung habe ich einen weiteren Fehler, dass AndroidHttpClient fehlt, aber das ist ein einfacher Fix hier diskutiert: https://github.com/robolectric/robolectric/issues/1862 – muetzenflo

7

Statt ActivityCompat der Verwendung von I ContextCompat.checkSelfPermission() bin mit, die einen Zusammenhang erhält, So senden Sie einen Schein des Kontexts und geben Sie die Erlaubnis zurück, das ist Arbeit für uns:

Statt:

ActivityCompat.checkSelfPermission(activity, permission); 

Verwendung

ContextCompat.checkSelfPermission(context, permission); 

dann in Ihrem Text können Sie einen Mock direkt auf Ihre hasPermissions Methode senden und Stummel das Ergebnis als:

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

Ist dieser Teil von ** Mockito ** oder ** Robolectric ** –

+1

Welcher Teil? 'ContextCompat' ist Teil des Android-Unterstützungspakets und der Rest ist normales Mockito – JavierSP1209

Verwandte Themen