¿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 …
- ¿Cómo forzar un cambio de configuración en una prueba Android Robolectric?
- ¿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?
- Robolectric + OkHttp + retrofit + prueba de unidad rxJava
- Android, Gradle. Cómo construir aplicaciones y ejecutar pruebas desde la aplicación de prueba
- ¿Existe una manera de escribir una prueba de unidad para una API de destino
: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)?
- Ejecución de una prueba de unidad específica con gradle
- Comprobación de que se ha iniciado una actividad con FLAG_ACTIVITY_CLEAR_TOP
- ActivityUnitTestCase arroja RuntimeException cuando se ejecuta con AndroidJUnitRunner
- ¿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
- Prueba de unidad de Android con Retrofit2 y Mockito o Robolectric
- ¿Cómo ejecutar pruebas de unidad con todos los permisos de Android M concedidos?
- Cuenta de simulacro en ActivityInstrumentationTestCase2
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"?