Utilice Robolectric para probar el inicio de un servicio con extras de intención?
¿Puedo usar Robolectric para probar que una Actividad inicia un Servicio con un Paquete específico aprobado con la Intención? Respuesta: ¡Sí!
Quiero escribir una prueba basada en Robolectric que pruebe que mi MainActivity
inicia MyService
con un número específico pasado en extras de intención:
- Problema con Robolectric con la nueva versión de los servicios de Google Play
- ¿Cómo crear sombras personalizadas en robolectric 3.0?
- Android.content.res.Resources $ NotFoundException en Robolectric 2.4
- Necesito Robolectric y Mockito en mi prueba, cada uno propone su propio TestRunner
- Android Studio + Robolectric + Gradle Class Not Found Excepción
En "MainActivity.java" Tengo el método
public void startMyService() { Intent i = new Intent(this, MyService.class); Bundle intentExtras = new Bundle(); // TODO: Put magic number in the bundle i.putExtras(intentExtras); startService(i); }
Y este es mi caso de prueba "MainActivityTest.java":
import ... @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class) public class MainActivityTest extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } @Test public void testShallPassMagicNumberToMyService() { MainActivity activityUnderTest = Robolectric.setupActivity(MainActivity.class); activityUnderTest.startMyService(); Intent receivedIntent = shadowOf(activityUnderTest).getNextStartedService(); assertNotNull("No intents received by test case!", receivedIntent); Bundle intentExtras = receivedIntent.getExtras(); assertNotNull("No intent extras!", intentExtras); long receivedMagicNumber = intentExtras. getLong(MyService.INTENT_ARGUMENT_MAGIC_NUMBER); assertFalse("Magic number is not included with the intent extras!", (receivedMagicNumber == 0L)); // Zero is default if no 'long' was put in the extras } }
Por lo tanto, mi pregunta es: ¿Puedo usar Robolectric para este propósito?
Creo que me di cuenta de esto, ver la respuesta a continuación …
El caso de prueba no funciona porque informa "No hay intención extras!". Usando el depurador he notado que Intent.putExtras () no tiene efecto en el entorno Robolectric. La i.mExtras
( Intent.mExtras
) se establece correctamente en una referencia de Bundle cuando ejecuto la aplicación en mi dispositivo. Cuando ejecuto el caso de prueba es null
. Supongo que esto sugiere que la respuesta a mi pregunta es "no", por lo que debo renunciar a este caso de prueba o hay alguna manera de lograr esta prueba?
Edit: Corregido el método startMyActivity()
ejemplo para reflejar lo que realmente tenía un problema con: Parece que la propiedad Intent.mExtras
no se llena a menos que haya algunos contenidos en el Bundle
(?). Esto difiere del entorno Android en vivo que es lo que analizo con el depurador.
- Error de instrumentación con pruebas RoboElectric 2 en IntelliJ
- Algunas pruebas Robolectric fallan cuando funcionan todas juntas pero pasan individualmente
- Ejecución de Gradle prueba con Robolectric y AppCompat resultados en NullPointerException
- No se pudieron determinar las dependencias para todas las tareas con robolectric gradle plugin
- Cómo probar que una intención ha sido difundida
- Robolectric - cómo desactivar una prueba de unidad?
- Manifiesto y problemas de configuración para conseguir que Robolectric trabaje con Android Studio 1.1.0
- Cómo burlar los permisos para realizar pruebas en Android?
¡No estaba enteramente exacto en cómo presenté mi código del ejemplo! He actualizado el ejemplo para mostrar el código con el que estaba teniendo problemas.
Resulta que hay una diferencia en cómo se gestiona un Intent en el entorno Robolectric en comparación con el entorno real de Android. Con Robolectric Intent.mExtras
no se rellena con Intent.putExtras()
menos que haya realmente algún contenido en el Bundle
añadido al Intent
como extras.
- ¿Por qué Android Wi-Fi Direct solo devuelve un servicio a la vez con discoverServices?
- Android Fragment onCreateView después de onDestroy no se vuelve a llamar