¿Puede Android ServiceTestCase <MyService> enviar mensajes a mi servicio?

Quiero probar mi servicio enlazado con ServiceTestCase. La prueba consiste en enlazar a MyBindServer, y enviar un mensaje. Viendo los registros, puede ver que el servicio se inicia cuando se llama onBind () y se envía un mensaje desde testAHello (), pero nunca se llama a handleMessage () del servidor.

De los registros:

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) 

Aquí está el código para 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(); } } 

Aquí está el código para 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(); } } } 

One Solution collect form web for “¿Puede Android ServiceTestCase <MyService> enviar mensajes a mi servicio?”

Pude conseguir esto funcionando usando el procedimiento abajo. Cualquier persona es bienvenida a chime en si esto es incorrecto, pero el ejemplo anterior funciona (es decir, el controlador de MyBindServer recibe mensajes)

Parece que el método bindService () de ServiceTestCase tiene la intención de actuar como un servicio local. En este caso, el objetivo es probar como un proceso separado, lo que significa utilizar lo siguiente en lugar de ServiceTestCase bindService:

 Intent bindIntent = new Intent(<registered intent>); //Where registered intent is declared in the manifest file getContext().bindService(bindIntent,mConn,Context.BIND_AUTO_CREATE); 

Donde mConn es un objeto ServiceConnection implementado para hacer lo que su prueba necesita que haga, en el caso anterior, configure mServer.

Con lo anterior, el handleMessage () de MyBindServer se llama para la prueba testAHello ().

UPDATE: He notado que dependiendo de la rapidez con que se realiza el proceso de prueba, teardown () se puede llamar antes de que el enlace esté listo para usar. En el caso anterior se añaden variables de control para acelerar el flujo del programa basado en el onServiceConnected de mConn que se llama a resultados consistentes proporcionados.

P.ej

 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"); } }; 

Luego añade:

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

A testAHello ()

  • Icono de servicio persistente en la barra de notificaciones
  • Servicio de Android: proceso vs. no
  • Servicio de ejecución en el fondo?
  • Cómo pasar valor de cadena de servicio a la actividad en android?
  • ¿Por qué NullPointerException ocurre con el uso de BillingService estándar?
  • Diferencia entre los receptores de servicio y difusión en android
  • Android Service.startForeground NO respeta la id unicidad de notificación
  • Conexión a un servicio web desde android - AsyncTask o Service?
  • Grabación de errores en vídeos android
  • ¿Hay alguna manera de obtener actualizaciones de fondo de la API de Google Fit?
  • Android - Ejecutar en segundo plano - Service vs. standard java class
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.