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

  • Cómo deshabilitar las pruebas de unidad de estudio de Android (androidTest)
  • ¿Hay alguien por ahí usando Robolectric sin Maven en IntelliJ?
  • Prioridad de hilo: 'prueba de unidad'
  • ¿Cómo forzar un cambio de configuración en una prueba Android Robolectric?
  • Robolectric + OkHttp + retrofit + prueba de unidad rxJava
  • ¿Cómo ejecutar pruebas de unidad con todos los permisos de Android M concedidos?
  • Android, Gradle. Cómo construir aplicaciones y ejecutar pruebas desde la aplicación de prueba
  • Mock Android Application class para pruebas con Robolectric en App con Dagger 2
  • Robolectric buildActivity () con espía Mockito?
  • ¿Cómo obtengo un reporte de cobertura de jacoco usando el complemento Android gradle 0.10.0 o superior?
  • ¿Cuál es la forma más rápida de ejecutar pruebas de unidad en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.