2016-08-22 4 views
1

私はアンドロイドで非同期メソッドのユニットテストを行いたいと思います。その結果は「オブザーバーのコールバックによって通知される」必要があります。以下の例を見てください。 doSomething()メソッドの単体テストケースを書くにはどうすればよいですか?非同期呼び出しのユニットテスト方法

public interface IFooObserver { 
    void onResult(String result); 
} 

public class Foo { 

    private IFooObserver mObserver; 

    public Foo(IFooObserver observer) { 
     mObserver = observer; 
    } 

    public void doSomething() { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // do something.. 
       mObserver.onResult("hello, world!"); 
      } 
     }).start(); 
    } 
} 
+1

可能な複製http://stackoverflow.com/questions/2321829/android-asynctask-testing-with-android-test-framework –

答えて

0

単純に:「ベアメタル」スレッドは使用しないでください。

executorServicesを代わりに使用してください。依存性注入を使用して、マルチスレッドコードをテスト用に単一スレッドのものにすることができるため、Same Thread Executor Serviceを使用します。

例:

class Whatever { 
    private final ExecutorService service; 
    Whatever() { this (Executors.newSingleThreadExecutor()); } 

    Whatever(ExecutorService service) { this.service = service; } 

    void foo() { 
    service.submit (... whatever 

ポイントは次のとおりです。あなたが直接スレッドを使用しているとき、あなたは何が制御することはできません。おそらく、それは複雑なシグナル伝達を必要とするテストケースにつながるか、悪化します。sleep()をここやそこで呼び出すことに頼ります。それは常に悪いことです。テストの実行時間が長くなります。あるいは、悪いことに、タイミングが間違っている。 時折あなたのテストは回帰中に失敗します。テストシステムの負荷が異なるため、実行時の特性が異なるスレッドがあります。

これは長い話です。可能であれば、スレッドを直接使用しないでください。代わりに上記の概念を使用して、複数のスレッドをテストするのを単に避けてください。

関連する問題