10

Android Marshmallowアプリで単体テスト用にRobolectricを使用したいと思っています。私はPermissionHelperを書いて、許可の扱いを少し簡単にする方法をいくつか挙げました。 (Android Robolectricユニットテストfor Marshmallow PermissionHelper

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

最初のアサートが動作します。

ここ
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テストです:このクラスのユニットテストを開始するには、私が最も簡単な方法をテストしようとしています許可はありません)。しかし、すべてのパーミッションをShadowApplicationで許可した後も、次のAssertでは拒否されます。

Robolectric.buildActivity()で作成されたPictureActivityは、アクセス許可の確認にShadowApplicationを使用していないと思います。しかしPictureActivity.getApplication()は私にShadowApplicationを与えず、grantPermissionsを呼び出します。これをどうすればテストできますか?

私はAndroidでRobolectricとユニットテストの初心者です...これを簡単にする/可能にする他のフレームワークがあれば:私は提案を受け付けています。

答えて

6

あなたの問題は、独自のアプリケーションではなく、アクセス許可を与えるために別のアプリケーションを使用していることです。これに代えて

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

はい、それは働きました!ありがとうございました。変更後、AndroidHttpClientが見つからないという別のエラーが発生しましたが、これは簡単な修正です:https://github.com/robolectric/robolectric/issues/1862 – muetzenflo

7

代わりのActivityCompatを使用して、私はコンテキストを受け取りContextCompat.checkSelfPermission()を使用しています、:

application = new ShadowApplication(); 

あなたは、このように、あなたアプリケーションの影を取得する必要があります文脈のモックを送って許可を返すと、これは私たちの仕事です:

代わりに:

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); 
+0

この部分は** Mockito **、または** Robolectricですか? ** –

+1

どちらの部分? 'ContextCompat'はAndroidサポートパッケージの一部であり、残りは通常のmockitoです – JavierSP1209

関連する問題