2016-09-09 13 views
1

私はAndroidアプリの単体テストを書いていますが、コードは変更しないでください。 java.util.Timerを使用してコードをテストする際に問題が発生しました。私はスケジュールされた時間まで待つ必要なしに、タスクを即座に実行させる方法を探しています。ローカルオブジェクトとして作成されているので、私はそれをMockitoと嘲笑することはできません。robolectric unit testアンドロイドタイマー

public void testedMethod() { 
    long time = 9999; 
    final Timer timer = new Timer() 

    timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      //do stuff 
     } 
    }, time); 
} 

@Test 
public void test() throws Exception { 
    testedObject.testedMethod(); 

    Thread.sleep(10000); 

    //verify that stuff was done 
} 

私はRobolectric(3.1)を使用していますので、私はShadowLooperRobolectricクラスのメソッドを使用してみましたが、無駄にしました。現在、私はThread.sleep()を使用しなければなりませんが、それはむしろ非妥協です。

Handlerによってスケジュールランナブルを実行するためにShadowLooper.runToEndOfTasks()を使用してのように、TimerTasksを予定し実行するためのTimerを強制する方法はありますか?

答えて

1

Handlerクラスのようにすぐにタスクを開始するには、この動作をサポートする独自のShadowTimerクラスを作成することができます。 ShadowLooperはタイマータスクではなくハンドラタスクでのみ機能します。ここで

どのようにタイマークラスをシャドーイングするのではなく、Androidのハンドラ・メカニズムを使用し、既存のコードを変更される場合がありhttp://robolectric.org/extending/

独自のShadowTimerクラスを作成する基本的な説明です。そしてあなたが必要とするものはすべて箱の中に存在します。

Handler handler = new Handler(); 
handler.postDelayed(runnable, 100); 
関連する問題