¿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 …

: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. Informe de Cobertura con PowerMock


Ejecutando el mismo testcase sin PowerMock *, las pruebas funcionan bien y el informe de cobertura se genera correctamente: Informe de Cobertura sin PowerMock

* 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 a ForkMode.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)?

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í:

  • Necesito Robolectric y Mockito en mi prueba, cada uno propone su propio TestRunner
  • ¿Cómo probar mejor el código Looper y Handler de la unidad en Android?
  • Crear PDU para Android
  • Pruebas de unidades de Android fallan para tipo de compilación de depuración
  • ¿Cómo puedo burlarme del contexto usando Mockito y Robolectric?
  • ¿Cómo burlar el método antes de que se cree la actividad?
  • Gradle - equivalente de test {} bloque de configuración para android
  • Prioridad de hilo: 'prueba de unidad'
  • Separar las pruebas de integración de las pruebas unitarias en Android Studio
  • Soporte de la clase Robolectric de Android. Cómo tener las referencias de la clase de biblioteca R desde el proyecto de aplicación
  • Unidad de pruebas de creación de una base de datos SQLite utilizando Spock y Robospock
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.