私はそれが再び新しいメッセージを送るメッセージを処理するとき、Handler
を持っている非常に単純なクラスを持っている:Robolectric:私の場合は、ハンドラの実行ルーパー
public class MyRepeatTask{
…
public void startTask() {
// send message with delay 5 sec
handler.sendMessageDelayed(handler.obtainMessage(…), 5000);
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// I put a log for unit test
System.out.println(“handling message …”);
// send message with delay again
handler.sendMessageDelayed(handler.obtainMessage(…), 5000);
}
}
}
あなたは上記を参照として、startTask()
が呼び出されたときに、ハンドラは5秒後にメッセージの送信を開始します。その後、handleMessage()
コールバックで、handler
は5秒の遅延でメッセージを再度送信します。これの目的は、何度かの作業(例えば、System.out.println()
など)を繰り返し実行することです。
私はRobolectricで上記のクラスをテスト:
@RunWith(RobolectricTestRunner.class)
public class MyRepeatTaskTest {
@Test
public void testStartTask() {
MyRepeatTask task = new MyRepeatTask();
task.startTask();
// run looper of ‘handler’ in task
ShadowLooper shadowLooper = Shadows.shadowOf(task.handler.getLooper());
shadowLooper.runToEndOfTasks();
// sleep for 30 seconds
Thread.sleep(30 * 1000);
}
}
私はSystem.out.println()
メッセージ「handling message …
」5秒ごとに見ることを期待しています。しかし、私がテストを実行すると、メッセージにが一度だけ表示されます。が端末にあります。
handler
のLooper
は、の1つだけタスクのために実行されているように見えます。
もし私が正しいのであれば、ルーペをRobolectricで常時稼働させるにはどうしたらいいですか?私が間違っていると、なぜ私は1つのログメッセージしか見ませんか?
========== UPDATE ===========
私は私がでThread.sleep(30 * 1000);
を置き換え、@rdsの答えを試してみました:
for (int i = 0; i < N; i++){
shadowLooper.runToEndOfTasks();
}
今N回「handling message …
」が見えます。しかし、全体のテストは遅延をシミュレートしていません。 handler.sendMessageDelayed(handler.obtainMessage(…), 5000)
でメッセージを送信すると、5秒間の遅延があります。そうすれば、Robolectricフレームワークはこの種の遅延メッセージをシミュレートしますか?私のテストでどのように遅れを取ることができますか?
これはより堅牢なテストでもあり、Robolectricはこのように機能します。あなたのコードが実行される時間に依存して、30秒で何回の反復が実行されるのかわからないが、 'runToEndOfTasks()'が何回呼び出されたかをテストは正確に知っている。ありがとう。 – rds
runToEndOfTasks()をN回呼び出すforループによってスレッドスリープを置き換える必要があるのですか? 'for(int i = 0; i
user842225
私の記事の私の更新を見てください。 – user842225