11

単体テストから、通知がアセットからカスタム サウンドを再生できるかどうかをテストしたいと考えています。このテストは何かを検証するためのものではありません。メインのアプリ コードを乱雑にすることなく、機能を簡単に実証する方法として作成しました。

そこで、テストプロジェクトでは、.wav ファイルを の中に追加しました/res/raw。通知ビルダーで次の URL を使用します。

Uri path = Uri.parse("android.resource://<main app package name>/testsound.wav");

その URL は、SO で読んでいる質問に従って機能するはずです。それが機能すると仮定しましょう。

テスト wav ファイルをメイン プロジェクトのフォルダーではなく、テスト プロジェクトのフォルダーに含めたくなかったので、テスト プロジェクトのリソースにアクセスできるように/res/raw、単体テストを拡張する必要があります。InstrumentationTestCase

コードは次のとおりです。

    NotificationCompat.Builder builder = new NotificationCompat.Builder(getInstrumentation().getContext());
    ...
    builder.setSound(path, AudioManager.STREAM_NOTIFICATION);
    ...
    NotificationManager notificationManager = (NotificationManager) getInstrumentation().getContext().getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(NOTIFICATION_ID, builder.build());

呼び出しは次のnotify例外をスローしています:

    java.lang.SecurityException: Calling uid 10198 gave package <main app package name> which is owned by uid 10199
    at android.os.Parcel.readException(Parcel.java:1540)
    at android.os.Parcel.readException(Parcel.java:1493)
    at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:611)
    at android.app.NotificationManager.notify(NotificationManager.java:187)
    at android.app.NotificationManager.notify(NotificationManager.java:140)
    ... 
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1873)

NotificationManagerServiceこの例外をクラスまで追跡しました:

    void checkCallerIsSystemOrSameApp(String pkg) {
        int uid = Binder.getCallingUid();
        if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) {
            return;
        }
        try {
            ApplicationInfo ai = AppGlobals.getPackageManager().getApplicationInfo(
                    pkg, 0, UserHandle.getCallingUserId());
            if (!UserHandle.isSameApp(ai.uid, uid)) {
                throw new SecurityException("Calling uid " + uid + " gave package"
                        + pkg + " which is owned by uid " + ai.uid);
            }
        } catch (RemoteException re) {
            throw new SecurityException("Unknown package " + pkg + "\n" + re);
        }
    }

どうやら、例外はカスタム サウンドとは何の関係もありませんが、InstrumentationTestCase.

これをテストする方法はありますか?過去に通知を作成した覚えがありAndroidTestCaseますが、そうするとテスト wav ファイルにアクセスできなくなります。wav を使用して jar を作成し、その jar をテスト プロジェクトの lib フォルダーにドロップすることもできますが、それではファイルが隠され、他のプログラマーは、将来それを置き換える必要がある場合にそれを探すのに苦労する可能性があります。

4

2 に答える 2