2013-09-23 8 views
9

RobolectricでHandlerコードをテストする際に問題があります。たとえば:Robolectric Run Handler投稿

public class Client { 
    private Handler mMainThreadHandler; 

    public interface Callback{ 
    void ok(); 
    } 

    public Client() { 
    mMainThreadHandler = new Handler(Looper.getMainLooper()); 
    } 

    public void doSomeStuff(Callback callback){ 
    //doing... 
    mMainThreadHandler.post(new Runnable(){ 
     @Override public void run() { 
     callback.ok(); 
     } 
    }); 
    } 
} 

は、どのように私はすぐにRunnableでコードを実行しますか?テストが実行される前に実行されません。

+0

あなたがメインスレッドまたはバックグラウンドスレッドでClient.doSomeStuff()を呼び出していましたか? – Poly

答えて

8

私は、これは仕事をしなければならないと思う:

Robolectric.runUiThreadTasks(); 

またはスケジュールが複数のタスク場合: org.robolectric.Robolectric.flushForegroundThreadScheduler
または
org.robolectric.shadows.ShadowLooper.runUiThreadTasks
:Robolectricバージョンあなたが使用する必要があります3.0の場合

Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
+0

**未解決の参照runUiThreadTasks ** –

11

org.robolectric.shadows.ShadowLooper.runUiThreadTasksIncludingDelayedTasks

参考:Robolectrie 3.0で2.4 to 3.0 Upgrade Guide

+0

シンボル** ShadowLooper **を解決できません –

3

はあなたが行うことができます

HandlerThread thread = new HandlerThread("test"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()); 
handler.post(new Runnable() {run(){ 
    int a = 0; 
}}; 
((ShadowLooper) ShadowExtractor.extract(thread.getLooper())).idle(); // this will execute line int a = 0;