2017-08-11 56 views
2

我正在使用Robolectric 3.4.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

讓我的東西哲學:)

開始儘管谷歌,樞紐和社區Robolectric大的力氣由於Android仿真是不是100%準確或真正的Android工作。因此,期望事情需要或手動調用,一些解決方法或根本不可能。這就是爲什麼我認爲Robolctric是單元測試的好幫手,但是應該在集成測試中避免。

你的測試絕對不是單元測試。您正在測試Android將遵循綁定服務調用。所有這些我都傾向於使用Instrumentation框架在仿真器/真實設備上的集成或UI測試中進行測試。

如果您想在Android調用其回調函數時測試您的服務是否正確運行。然後我會考慮它是單元測試,手動調用方法是完全正確的方法。

希望它會死!

相關問題