¿Puedo usar Cobertura en pruebas de unidad con PowerMock?
Problema
Estoy configurando la cobertura del código de prueba de unidad para una biblioteca de Android que utiliza Robolectric para ejecutar las pruebas y PowerMock / Mockito para pruebas simuladas.
Sin embargo, ejecutar pruebas unitarias con resultados de Cobertura en la Excepción siguiente …
- Separar las pruebas de integración de las pruebas unitarias en Android Studio
- ActivityUnitTestCase arroja RuntimeException cuando se ejecuta con AndroidJUnitRunner
- Prueba de unidades de Android en Eclipse: "Error al iniciar la prueba"
- ¿Por qué obtengo un NoClassDefFoundError al ejecutar mi prueba en ActionBarActivity?
- Robolectric filenotFound en archivos de activos
:example:testDebugUnitTest Exception in thread "Thread-5" java.lang.ExceptionInInitializerError at com.example.package.saas.Query$RemoveWordsType.__cobertura_init(Query.java) at com.example.package.saas.Query$RemoveWordsType.<clinit>(Query.java) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesToSingleClassOnProjectData(TouchCollector.java:123) at net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesOnProjectData(TouchCollector.java:110) at net.sourceforge.cobertura.coveragedata.ProjectData.saveGlobalProjectData(ProjectData.java:272) at net.sourceforge.cobertura.coveragedata.SaveTimer.run(SaveTimer.java:33) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.IllegalStateException: Shutdown in progress at java.lang.ApplicationShutdownHooks.add(ApplicationShutdownHooks.java:66) at java.lang.Runtime.addShutdownHook(Runtime.java:211) at net.sourceforge.cobertura.coveragedata.ProjectData.initialize(ProjectData.java:239) at net.sourceforge.cobertura.coveragedata.ProjectData.getGlobalProjectData(ProjectData.java:209) at net.sourceforge.cobertura.coveragedata.TouchCollector.<clinit>(TouchCollector.java:45) ... 11 more
… y el informe Cobertura generado no muestra cobertura alguna.
Ejecutando el mismo testcase sin PowerMock *, las pruebas funcionan bien y el informe de cobertura se genera correctamente:
* Es decir, comentar las pruebas usando PowerMock, quitando la anotación de PowerMockIgnore
, el PowerMockRule
y el MockitoAnnotations.initMocks(this);
invocación.
Investigación
- Veo que algunos usuarios han solucionado un problema similar estableciendo
forkmode="once"
en su testinguite.
Sin embargo, esta no es la solución, ya que estoy usando Gradle que defectos en proyectos Java aForkMode.ONCE
. - Otros usuarios que reportaron un problema similar lo corrigieron al actualizar PowerMock a 1.5.4 .
He intentado degradar a esta versión, pero el problema sigue siendo. - Finalmente, se corrigió un problema similar especificando explícitamente una dependencia de
cobertura-runtime
, pero agregando que tampoco cambiaba nada.
Pregunta
¿Es posible usar Cobertura junto con PowerMock?
- En ese caso, ¿qué me falta?
- De lo contrario, ¿cómo debo medir la cobertura de código con tal configuración (Android Library + Robolectric + PowerMock)?
- ¿Por qué Robotium es más lento cuando realiza tareas sencillas de interfaz de usuario en comparación con el código nativo de Android?
- Error en la automatización de las pruebas de interfaz de usuario de Android en Jenkins-Server debido a complejas dependencias del proyecto lib de los proyectos principales.
- Soporte de la clase Robolectric de Android. Cómo tener las referencias de la clase de biblioteca R desde el proyecto de aplicación
- Crear PDU para Android
- Android: Unidad de pruebas de aplicaciones Android con Robolectric y Mockito
- Prueba de unidad de Android con Retrofit2 y Mockito o Robolectric
- ¿Cómo puedo usar Active Android con una base de datos en memoria para las pruebas de unidad usando Robolectric?
- Pruebas de escritura para aplicaciones Flow and Mortar
En este momento, Android Studio integra jacoco automáticamente para hacer cobertura de código.
Sólo tienes que añadir unas pocas líneas de código:
apply plugin: 'jacoco-android'
android { buildTypes { debug { testCoverageEnabled = true } } }
Más información aquí:
- Android: LayoutParams para TextView hace que la vista desaparezca, programáticamente
- SetAdapter "La llamada requiere el nivel 11 de la API (el min actual es 8): android.widget.AbsListView # setAdapter"?