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
- Importar correctamente el método AssertThat para Robolectric Test
- Cómo configurar Robolectric en Android Studio 1.0
- Java.lang.ClassNotFoundException: android.R
- Automatización de la caja de prueba de la unidad Android: biblioteca Robolectric vs marco de pruebas de Android
- Junit testing con gradle para un proyecto android
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?
- Prueba de fragmentos con Robolectric 3.0
- Prueba de vistas personalizadas con Robolectric: Ancho y altura siempre son 0
- ¿Cómo puedo sombrear el PackageManager con Robolectric
- Mock Retrofit Observable <T> respuesta en las pruebas de la unidad Android
- Ejecutar Robolectric en IDEA detrás del proxy
- Osx maven running tests Excepción: java.lang.OutOfMemoryError lanzado desde el UncaughtExceptionHandler en el subproceso "main"
- Módulos Robolectric y Library con archivos de recursos
- Robolectric lanza Recursos $ NotFoundException al intentar acceder al recurso en la carpeta raw
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).
- Android AutoCompleteTextView muestra información de objeto en lugar de texto en modo horizontal
- No se puede crear un reproductor multimedia (mediante url)