Cómo probar tu servicio

Si implementas un Service local como componente de tu app, puedes crear pruebas de instrumentación para verificar que su comportamiento sea correcto.

AndroidX Test proporciona una API para probar los objetos Service de forma aislada. La clase ServiceTestRule es una regla de JUnit 4 que inicia el servicio antes de que se ejecuten los métodos de prueba de unidades y cierra el servicio una vez que se completan las pruebas. Para obtener más información sobre las reglas de JUnit 4, consulta la documentación de JUnit.

Cómo configurar el entorno de pruebas

Antes de crear la prueba de integración para el servicio, asegúrate de configurar el proyecto para pruebas instrumentadas, como se describe en Cómo configurar el proyecto para la prueba de AndroidX.

Cómo crear una prueba de integración para servicios

La prueba de integración se debe escribir como una clase de prueba de JUnit 4. Si quieres obtener más información para crear clases de prueba JUnit 4 y usar los métodos de aserción de JUnit 4, consulta Cómo crear una clase de prueba instrumentada.

Crea una instancia de ServiceTestRule en tu prueba mediante la anotación @Rule.

Kotlin


@get:Rule
val serviceRule = ServiceTestRule()

Java


@Rule
public final ServiceTestRule serviceRule = new ServiceTestRule();

En el siguiente ejemplo, se muestra cómo implementar una prueba de integración para un servicio. El método de prueba testWithBoundService() verifica que la app se vincule de forma correcta a un servicio local y que la interfaz del servicio se comporte de manera correcta.

Kotlin


@Test
@Throws(TimeoutException::class)
fun testWithBoundService() {
  // Create the service Intent.
  val serviceIntent = Intent(
      ApplicationProvider.getApplicationContext<Context>(),
      LocalService::class.java
  ).apply {
    // Data can be passed to the service via the Intent.
    putExtra(SEED_KEY, 42L)
  }

  // Bind the service and grab a reference to the binder.
  val binder: IBinder = serviceRule.bindService(serviceIntent)

  // Get the reference to the service, or you can call
  // public methods on the binder directly.
  val service: LocalService = (binder as LocalService.LocalBinder).getService()

  // Verify that the service is working correctly.
  assertThat(service.getRandomInt(), `is`(any(Int::class.java)))
}

Java


@Test
public void testWithBoundService() throws TimeoutException {
  // Create the service Intent.
  Intent serviceIntent =
      new Intent(ApplicationProvider.getApplicationContext(),
        LocalService.class);

  // Data can be passed to the service via the Intent.
  serviceIntent.putExtra(LocalService.SEED_KEY, 42L);

  // Bind the service and grab a reference to the binder.
  IBinder binder = serviceRule.bindService(serviceIntent);

  // Get the reference to the service, or you can call
  // public methods on the binder directly.
  LocalService service =
      ((LocalService.LocalBinder) binder).getService();

  // Verify that the service is working correctly.
  assertThat(service.getRandomInt()).isAssignableTo(Integer.class);
}

Recursos adicionales

Para obtener más información sobre este tema, consulta los siguientes recursos adicionales.

Ejemplos