Por qué no hay instrumentos de prueba para BroadcastReceiver?
-
28-09-2019 - |
Pregunta
Tal vez me falta algo. Quiero escribir casos de prueba para un BroadcastReceiver; específicamente, es para recibir el evento BOOT_COMPLETED y el establecimiento de una alarma para otro receptor de mango más tarde; no parece estar preparando adecuadamente, pero el punto es que no tengo ninguna manera obvia para probarlo. No puedo adjuntar exactamente un depurador y esperar a que BOOT_COMPLETED, y no puedo enviar una falsificación BOOT_COMPLETED emisión.
¿Por qué hay clases de instrumentación para la actividad, servicio, y el proveedor, pero no BroadcastReceiver? Cualquier consejo para probar esto?
Solución
No hay nada mágico sobre el ciclo de vida para el BroadcastReceiver. Es suficiente para probarlo con un AndroidTestCase. En un caso de prueba, instancia su BroadcastReceiver, crear lo Intención que desea enviar y llamar a OnReceive utilizando el contexto disponible de AndroidTestCase o algún contexto simulado.
por ejemplo.
public class TestMyBroadcastReceiver extends AndroidTestCase {
public void testReceive() {
MyBroadcastReceiver r = new MyBroadcastReceiver();
Intent i = new Intent("MY_ACTION");
// TODO put extras
r.onReceive(getContext(), i);
// TODO query application state to verify results
}
}
Otros consejos
Para la mayoría de los casos estoy completamente de acuerdo con ??https://stackoverflow.com/a/5181010/527016
Hay sin embargo casos cuando se extiende AndroidTestCase
no es adecuado (y puede causar sorpresas). En particular, si usted está haciendo las pruebas de integración más compleja y desea probar su BroadcastReceiver
con un Intent
real enviada por el sistema. La razón principal es que el método onReceive
en el receptor de radiodifusión se ejecuta en el hilo principal aplicación, mientras que las pruebas de funcionamiento AndroidTestCase
en otro hilo. Esto puede causar problemas de threads de prueba relacionada en el código que no fue pensado para funcionar en varios subprocesos.
La solución a esto es a subclase su prueba de InstrumentationTestCase
lugar y el uso de la anotación @UiThreadTest
para hacer las pruebas se ejecutan en el mismo hilo como el método onReceive
.
Para obtener más información (y un ejemplo) véase: http : //olafurhelgason.blogspot.com/2012/12/threading-and-android-integration.html