android.content.BroadcastReceiver Using Android ICS of android.test.AndroidTestCase

2012-01-07T00:00:00+00:00 Android Java

Android4.0以前だとonReceiveメソッドをそのままインスタンスメソッドとしてAndroidTestCaseを使ってテスト出来たんですけど、Android4.0からだとエラーになる。そのエラーになるケースがsetResultExtrasを使った場合になるんですが[APIドキュメント][1]によると

Change the current result extras of this broadcast; only works with broadcasts sent through Context.sendOrderedBroadcast. This is a Bundle holding arbitrary data, whose interpretation is up to the broadcaster. Can be set to null. Calling this method completely replaces the current map (if any). This method does not work with non-ordered broadcasts such as those sent with Context.sendBroadcast

って書いちゃってんすよね。英語読める訳じゃないけど、要するにsetResultExtrasを使う場合はonReceiveをそのまま実行してもsendBroadcastでやっても出来ないらしいっぽい事を書いてる気がする。じゃあどないすんねんと。まぁ書いてあるとおりにsendBroadcastではなく、sendOrderedBroadcastを使えとの事らしいので

SampleBroadcastReceiver.java

package sample.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

public class SampleBroadcastReceiver extends BroadcastReceiver {

    public static final String ACTION = "sample.test.receiver";

    @Override
    public void onReceive(final Context context, Intent intent) {
        if (ACTION.equals(intent.getAction())) {
            if (isOrderedBroadcast()) {
                Bundle bundle = new Bundle();
                bundle.putString("name", "hoge");

                setResultExtras(bundle);
            }
        }
    }
}

まぁあくまで検証目的なので適当に。OrderedBroadcastが必要な部分だけisOrderedBroadcastでブロック切り分ければ良いはず

SampleBroadcastReceiverTestCase.java

package sample.test;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.test.AndroidTestCase;
import android.util.Log;

public class SampleBroadcastReceiverTestCase extends AndroidTestCase {

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context ctx, Intent intent) {
            Bundle bundle = getResultExtras(false);

            Log.v("TAG",bundle.toString());

            assertNotNull(bundle);
            assertEquals(bundle.getString("name"), "hoge");
        }
    };

    public void test() {
        Context ctx = getContext();

        IntentFilter filter = new IntentFilter();
        filter.addAction(SampleBroadcastReceiver.ACTION);

        ctx.registerReceiver(new SampleBroadcastReceiver(), filter);

        Intent intent = new Intent(SampleBroadcastReceiver.ACTION);

        ctx.sendOrderedBroadcast(intent, null, receiver, null, 1, null, null);
    }
}

まぁやってみると

  • SampleBroadcastReceiverTestCase
  • SampleBroadcastReceiver
  • SampleBroadcastReceiverTestCase(receiver)

という流れで行く模様。ただテスト側がfailするコード書いてもEclipse上でAndroid JUnitでテストを動かしてもSuccessfulにしかならない。けど、logcatすると思いっきりエラー出てる。なのでこれのテストをする場合にはlogcatを見ながらじゃないとテスト出来ないというオチがあるんですけど

まぁこれで良いかは非常に微妙な所なんだけど、とりあえずはこんな感じでテスト出来る模様

[1]: http://developer.android.com/reference/android/content/BroadcastReceiver.html#setResultExtras

UbuntuでObjective-C XMLHttpRequest.prototype.open by Unit Test