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:

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.

¡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.

  • Prueba de Android con Robolectric
  • Robolectric Unit Test falla con las actualizaciones de Android Studio 2.3
  • Módulos Robolectric y Library con archivos de recursos
  • Robolectric 3.0 - Recurso no resuelto cuando se utiliza applicationIdSuffix
  • Prueba de unidad de Android con Retrofit2 y Mockito o Robolectric
  • Prueba Robolectric se ejecuta en Android Studio, pero no por gradle en la consola
  • Confused sobre testCompile y androidTestCompile en Android Gradle
  • Robolectric Run
  • Cómo calcular la cobertura de la prueba con Robolectric
  • No se puede usar FakeHttpLayer de Robolectric (NullPointerException al llamar a getFakeHttpLayer)
  • Prueba de vistas personalizadas con Robolectric: Ancho y altura siempre son 0
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.