La prueba asyncTask no se ejecuta

Estoy usando robolectric para probar mi clase AsyncTask. En la prueba hace lo que espero cuando la tarea se ejecuta así:

asyncTask.execute() 

Pero cuando lo hago

 asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) 

No lo hace (en ambos casos corro

 Robolectric.runUiThreadTasksIncludingDelayedTasks() 

Alguien tiene alguna idea de por qué llamar a executeOnExecutor no desencadenar Robolectric para ejecutar, pero ejecuta funciona bien?

El marco Robolectric no puede funcionar fuera de la caja con los ejecutores predeterminados (es decir, AsyncTask.THREAD_POOL_EXECUTOR o AsyncTask.SERIAL_EXECUTOR), ni con los personalizados.

Para resolver este problema, puede tomar uno de estos dos enfoques, dependiendo de si tiene control sobre el ejecutor que la unidad probada utiliza. Si la respuesta es SÍ, el primer enfoque sería simplemente conseguir que utilice RoboExecutorService (o si utiliza versiones bajo 3.0 – RobolectricBackgroundExecutorService ). De lo contrario, tendrá que tomar un enfoque diferente que es aplicar esta solución de 2 pasos:

Definición de una sombra AsyncTask personalizada

Lo primero que debe hacer es implementar una sombra AsyncTask que anula la ejecución en los ejecutores personalizados:

 @Implements(AsyncTask.class) public class MyShadowAsyncTask<Params, Progress, Result> extends ShadowAsyncTask<Params, Progress, Result> { @Implementation public AsyncTask<Params, Progress, Result> executeOnExecutor(Executor executor, Params... params) { return super.execute(params); } } 

Registro de la sombra personalizada

En cada caso de prueba que ejecuta código de producción que utiliza AsyncTask#executeOnExecutor() , registre su sombra personalizada para anular el valor predeterminado de Robolectric, de esta manera (revise la anotación 'config'):

 @RunWith(RobolectricTestRunner.class) @Config(shadows={MyShadowAsyncTask.class}) public class MyTest { // ... test code } 

Las llamadas Robolectric.runUiThreadTasks() a Robolectric.runUiThreadTasks() o Robolectric.runUiThreadTasksIncludingDelayedTasks() funcionarán como se esperaría (es decir, bloquearían el subproceso del corredor hasta que se completaran las tareas asíncronas).

  • ¿Cómo puedo saber si mi aplicación se ejecuta con Robolectric?
  • Prueba de ViewPager (y CursorLoader) con Robolectric
  • Roboelectric RoboAttributeSet - Cómo usar esto
  • Obteniendo java.lang.RuntimeException: Stub al ejecutar Robolectric a través de Maven
  • Robolectric + Eclipse ¿No encuentra recursos?
  • Estoy estudiando Robolectric pero se ha producido un error
  • Robolectric - No se pudo cargar la clase: org.robolectric.shadows.ShadowMultiDex
  • Prueba de tareas asíncronas con robolectric
  • No se puede localizar un Java Runtime Android Studio Robolectric
  • Cómo probar el servicio remotel
  • Robolectric 3.0 InflateException con un fragmento personalizado de mapa
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.