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()); } 
  • ¿Por qué no hay instrumentación de prueba para BroadcastReceiver?
  • ¿Cuál es el propósito de las anotaciones de @SmallTest, @MediumTest y @LargeTest en Android?
  • TDD en Android con Robolectric y Mockito
  • ¿Es posible entrar en el modo de depuración para android cuando se ejecuta junit test?
  • Prueba de unidad de Android cuando la actividad tiene animación
  • Cómo probar esta línea de LayoutInflater.from () en android
  • Googletest para Android NDK
  • Uso de una carpeta de recursos en el proyecto de prueba para datos de cadena de prueba
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.