2017-08-11 15 views
2

私はRobolectric 3.4.2を使用しており、2つのサービス間の相互作用をテストする必要があります。私のテストでRobolectricは別のスレッドからサービスをバインドしません

私はダミーのサービスを書いた:

ShadowApplication.getInstance().setComponentNameAndServiceForBindService(
     new ComponentName(SERVICE.getPackageName(), SERVICE.getClassName()), 
      new Binder() { 
       @Override 
       public IInterface queryLocalInterface(final String descriptor) { 
        return null; 
       } 
      } 
    ); 

を、私は私のテストケースから直接BindServiceを起動した場合、それは動作しますが、bindServiceへの呼び出しは、(実際のアプリケーションのように別のスレッドである場合)、onServiceConnected()コールバックは決して呼び出されません。

ServiceConnection connection = new ServiceConnection(){ 

    @Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     try { 
      doSomething(); 
     } catch (Exception e) { 
      Log.e(TAG, "Cannot Do Something", e); 
     } 
     mContext.unbindService(this); 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) { } 
}; 

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     mContext.bindService(SERVICE.createIntent()), connection, Context.BIND_AUTO_CREATE); 
    } 
}).start(); 

私は何か間違っているのですか、このように動作すると思われますか?

答えて

0

私はAndroidのエミュレーションが100%正確か、本当のアンドロイドとして働いていないとしてGoogle、ピボタルやコミュニティRobolectricから大きな努力にもかかわらず、哲学的な何か:)

から始めましょう。したがって、必要なものや手動の呼び出し、いくつかの回避策があるか、まったく不可能であることを期待してください。だから、Robolctricは単体テストの良いヘルパーだと思っていますが、統合テストでは避けるべきです。

あなたのテストは単体テストではありません。あなたはAndroidがあなたのバインドサービスコールに従うことをテストしています。私は、Instrumentationフレームワークを使ったエミュレータ/リアルデバイスの統合テストやUIテストでこのようなことをテストする傾向があります。

サービスがAndroidでコールバックを呼び出すときに正しく動作することをテストする場合は、それから私はそれが単体テストであり、メソッドの手動呼び出しが完全にうまく、適切な方法であると考えます。

希望します。

関連する問題