Cómo verificar IntentService start

Estoy tratando de probar el comportamiento de mi aplicación con Espresso-2.2

En la actividad principal, cuando se pulsa el botón, tanto el servicio como otra actividad se está iniciando:

public class MainActivity extends Activity { public void onButtonClicked() { startActivity(SecondActivity.getStartIntent()); startService(MyIntentService.getStartIntent()); } } 

Estoy probando si se están iniciando los componentes deseados:

 public class MainActivityTest { @Rule public final IntentsTestRule<MainActivity> intentsRule = new IntentsTestRule<>(MainActivity.class, true); @Test public void shouldStartServiceOnButtonClicked() { onView(withId(R.id.button)).perform(click()); intended(hasComponent(hasClassName(SecondActivity.class.getName()))); intended(hasComponent(hasClassName(MyIntentService.class.getName()))); } } 

Pero estoy recibiendo error:

 Caused by: junit.framework.AssertionFailedError: Wanted to match 1 intents. Actually matched 0 intents. IntentMatcher: has component: has component with: class name: is "com.example.MyIntentService" package name: an instance of java.lang.String short class name: an instance of java.lang.String Matched intents:[] Recorded intents: -Intent { cmp=com.example/.SecondActivity (has extras) } handling packages:[[com.example]], extras:[Bundle[...]]) at junit.framework.Assert.fail(Assert.java:50) 

Se registra el inicio de SecondActivity. ¿Por qué el inicio de mi IntentService no está registrado (he comprobado que se ha iniciado)?

Tl; dr no parece como si esto es posible dado el actual espresso-intenciones proporcionada funcionalidad

Cavé en el código fuente, ya que estoy tratando de hacer algo similar y esto es lo que encontré:

El matcher 'pretendido' funciona mirando una lista de intents grabados. Éstos son rastreados por una devolución de llamada que se registra con la instancia de IntentMonitor cuando Intents.init () se llama. La instancia de IntentMonitor está definida por el Instrumentation actual. Cada vez que se llama a la señalIntent () del IntentMonitor, se disparará la devolución de llamada en Intents.

El problema radica en el hecho de que signalIntent () nunca se llama en el caso en que se llama a activity.startService () con una intención. Esto se debe a que signalIntent () en el caso de AndroidJunitRunner sólo recibe el llamado por métodos que están expuestos en ExposedInstrumentationApi (que suceden a correlacionar sólo a los diversos métodos startActivity ()). Para usar espresso-intents con startService () parecería que un gancho de instrumentación para startService () necesitaría estar disponible que permitiría llamar a signalIntent () en el IntentMonitor.

No tengo experiencia con la adición de instrumentación personalizada a mis test apks, pero esta va a ser mi próxima avenida de investigación. Actualizaré mi respuesta si descubro algo que funcione.

Podría hacer una conjetura educada que el problema es que usted está atando para afirmar que el IntentService se crea y se ejecuta inmediatamente después de que usted llama startService() , mientras que el startService() no es llamada sincrónica. Sucede en el hilo de UI, pero no imidiately. Usted puede posponer la validación por unos pocos molinos y comprobar entonces si el servicio comenzó.

  • Capturar IntentService Intents antes onHandleIntent
  • Evitar que el "proceso de Android" sea un error "incorrecto"
  • ¿Cómo hacer que WakefulService (IntentService) espere hasta que MediaPlayer termine?
  • ¿Necesita ayuda para descargar imágenes de fondo en Android?
  • IntentService responde a muertos ResultReceiver
  • Antecedentes Proceso para escanear la ubicación del usuario a intervalos regulares y actualizar la base de datos local incluso cuando la aplicación no está abierta
  • Evitar el cambio de orden de la presentación de la aplicación Android después del lanzamiento del servicio intencional
  • ¿Debe onHandleIntent ser llamado cuando IntentService se inicia con bindService?
  • Android: ¿Cómo obtener el contexto de la actividad de llamadas en un IntentService?
  • Android IntentService no está iniciando
  • Android: mejor práctica para volver a intentar IntentService
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.