2011-07-07 3 views
5

ServiceTestCaseを使用してバインドされたサービスをテストしたいと考えています。 テストは、MyBindServerへのバインディングとメッセージの送信で構成されています。 ログを見ると、onBind()が呼び出されたときにサービスが開始され、 というメッセージが表示され、testAHello()からメッセージが送信されますが、サーバーのhandleMessage()は呼び出されません。ログからAndroidのServiceTestCase <MyService>はサービスにメッセージを送信できますか?

:ここ

I/TestRunner(2099): started: testAHello(com.inthinc.mybindserver.test.MyBindServerTest) 
I/MyBindServerTest(2099): setUp() 
I/MyBindServer(2099): onBind, action=com.inthinc.mybindserver.START 
I/MyBindServerTest(2099): testAHello 
I/MyBindServerTest(2099): sending SAY_HELLO 
[here is where I expect to see the output from handleMessage()] 
I/MyBindServerTest(2099): tearDown() 
I/TestRunner(2099): finished:testAHello(com.inthinc.mybindserver.test.MyBindServerTest) 
I/TestRunner(2099): passed: testAHello(com.inthinc.mybindserver.test.MyBindServerTest) 

がMyBindServer.javaのコードです:ここで

package com.inthinc.mybindserver; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.IBinder; 
import android.os.Message; 
import android.os.Messenger; 
import android.util.Log; 

public class MyBindServer extends Service { 
    static final String TAG = "MyBindServer"; 
    public static final int MSG_SAY_HELLO = 1; 
    final Messenger mMessenger = new Messenger(new IncomingHandler()); 

    class IncomingHandler extends Handler { 
     @Override 
     public void handleMessage(Message msg) { 
      Log.i(TAG, String.format("handleMessage, what=%d", msg.what)); 
      switch (msg.what) { 
       case MSG_SAY_HELLO: 
        Log.i(TAG, "hello"); 
        break; 
       default: 
        super.handleMessage(msg); 
      } 
     } 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     Log.i(TAG, String.format("onBind, action=%s", intent.getAction())); 
     return mMessenger.getBinder(); 
    } 

} 

はMyBindServerTest.javaのコードです:

package com.inthinc.mybindserver.test; 

import com.inthinc.mybindserver.MyBindServer; 

import android.content.Intent; 
import android.os.IBinder; 
import android.os.Message; 
import android.os.Messenger; 
import android.os.RemoteException; 
import android.test.ServiceTestCase; 
import android.test.suitebuilder.annotation.SmallTest; 
import android.util.Log; 

public class MyBindServerTest extends ServiceTestCase<MyBindServer> { 
    private static final String TAG = "MyBindServerTest"; 
    Messenger mServer = null; 

    public MyBindServerTest() { 
     super(MyBindServer.class); 
    } 

    public MyBindServerTest(Class<MyBindServer> serviceClass) { 
     super(serviceClass); 
    } 

    @Override 
    public void setUp() { 
     try { 
      super.setUp(); 
      Log.i(TAG, "setUp()"); 
      Intent bindIntent = new Intent("com.inthinc.mybindserver.START"); 
      IBinder binder = bindService(bindIntent); 
      assertNotNull(binder); 
      mServer = new Messenger(binder); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void tearDown() { 
     try { 
      super.tearDown(); 
      Log.i(TAG, "tearDown()"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @SmallTest 
    public void testAHello() { 
     Log.i(TAG, "testAHello"); 
     assertNotNull(mServer); 
     Message msg = Message.obtain(null, MyBindServer.MSG_SAY_HELLO); 
     Log.i(TAG, "sending SAY_HELLO"); 
     try { 
      mServer.send(msg); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

答えて

3

私ができました下の手順を使用して、この作業を取得します。これは間違っている場合、誰もがチャイムに歓迎されますが、上記の例では、私は.e。 MyBindServerのハンドラがメッセージを受け取る)

ServiceTestCaseのbindService()メソッドがローカルサービスのように動作しているようです。この場合、目的は以下の代わりにServiceTestCaseのbindServiceのを使用して意味し、別のプロセスとしてテストすることです:

にmConnがServiceConnectionオブジェクトは、あなたのテストを行うには、それを必要とするものは何でもするために実装され
Intent bindIntent = new Intent(<registered intent>); //Where registered intent is declared in the manifest file 
getContext().bindService(bindIntent,mConn,Context.BIND_AUTO_CREATE); 

上記の場合、mServerを設定します。

これで、MyBindServerのhandleMessage()がtestAHello()テストのために呼び出されます。

更新:私は、テスト処理がどれほど速く行われたかによって、バインディングを使用できるようになる前にteardown()を呼び出すことができることに気付きました。上記の場合、mConnのonServiceConnectedに基づいてプログラムフローを抑制するために制御変数を追加すると、一貫した結果が得られます。

など。

protected boolean bound = false; 
protected boolean processed = false; 
private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, 
      IBinder service) { 
     Log.i(TAG,"Service conn"); 

     mServer = new Messenger(service); 
     if(mServer != null 
       && mServer != null){ 
      bound = true; 
     } 
     processed = true; 
    } 

@Override 
public void onServiceDisconnected(ComponentName name) { 
    // TODO Auto-generated method stub 
    Log.i(TAG,"Service Disconn"); 
} 
}; 

次に追加:

while(!processed){  
try { 
    Thread.sleep(1000); 
    } catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
} 

をtestAHello(へ)

+0

あなたは、 "登録した意図" とはどういう意味ですか? – serj

関連する問題