Prueba de unidad Actividad.startService () llamada?

Intentando escribir mi primera aplicación Android-by-TDD (he escrito algunas pequeñas aplicaciones de Android sin TDD, estoy familiarizado con el entorno), pero parece que no puedo dar la vuelta a cómo escribir mi primera prueba.

El escenario:

Tengo una actividad, TasksActivity, y un servicio, TasksService. Tengo que probar que TasksActivity inicia TasksService en su método onStart ().

La prueba que he escrito es la siguiente:

public class ServiceControlTest extends ActivityUnitTestCase<TasksActivity>{ public ServiceControlTest() { super(TasksActivity.class); } public void testStartServiceOnInit () { final AtomicBoolean serviceStarted = new AtomicBoolean(false); setActivityContext(new MockContext() { @Override public ComponentName startService(Intent service) { Log.v("mockcontext", "Start service: " + service.toUri(0)); if (service.getComponent().getClassName().equals (TasksService.class.getName())) serviceStarted.set(true); return service.getComponent(); } }); startActivity(new Intent(), null, null); assertTrue ("Service should have been started", serviceStarted.get()); } } 

En mi método onCreate () en TasksActivity tengo:

  startService(new Intent(this, TasksService.class)); 

También he intentado

  getBaseContext().startService(new Intent(this, TasksService.class)); 

Pero en ninguno de los dos casos se llama al método startService de MockContext. ¿Hay alguna manera de configurar la interceptación de este método? Preferiría no tener que empezar a envolver las API básicas de Android para realizar pruebas básicas …

Sólo para resumir la conversación con Brian Dupuis en los comentarios, el problema era que MockContext no proporciona las instalaciones que son requeridas por la instrumentación de prueba para poder llamar correctamente a onCreate() . Cambiar de MockContext a ContextWrapper resuelto este problema.

La prueba de trabajo se ve así:

 public void testStartServiceOnInit () { final AtomicBoolean serviceStarted = new AtomicBoolean(false); setActivityContext(new ContextWrapper(getInstrumentation().getTargetContext()) { @Override public ComponentName startService(Intent service) { Log.v("mockcontext", "Start service: " + service.toUri(0)); if (service.getComponent().getClassName().equals ("net.meridiandigital.tasks.TasksService")) serviceStarted.set(true); return service.getComponent(); } }); startActivity(new Intent(), null, null); assertTrue ("Service should have been started", serviceStarted.get()); } 
  • Android Studio + Robolectric + Gradle Class Not Found Excepción
  • ¿Por qué no hay instrumentación de prueba para BroadcastReceiver?
  • TDD en Android con Robolectric y Mockito
  • Desarrollo impulsado por pruebas de Android
  • ¿Cuál es el propósito de las anotaciones de @SmallTest, @MediumTest y @LargeTest en Android?
  • Desarrollo impulsado por pruebas para Android
  • ¿Cómo acceder a los recursos por ID en la prueba de unidad de Android?
  • Cómo probar menú en Android con Robolectric
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.