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:
- ¿Cómo acceder a los recursos por ID en la prueba de unidad de Android?
- Cómo configurar Robolectric en Android Studio 1.0
- Cómo probar menú en Android con Robolectric
- Desarrollo impulsado por pruebas de Android
- ¿Es una prueba UNIT o una prueba de integración?
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 …
- ¿Utilizando Inyección de Dependencia con Roboguice?
- Desarrollo impulsado por pruebas para Android
- Prueba de componente en Android App SDLC?
- Unidad de pruebas de las clases de Android realista. Entorno de prueba, ciclo de vida y respuestas
- TDD para Cocos2d-X en android
- Mock de almacenamiento de prueba de Android
- Android Studio + Robolectric + Gradle Class Not Found Excepción
- ¿Cómo compartir recursos entre la prueba de unidad y la prueba de instrumentación en android?
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()); }
- ¿Cómo deshabilitar el umbral de movimiento al obtener eventos táctiles?
- Fijas fijas en nuevo diseño de material android