android - software - ¿Puedo usar Cobertura en pruebas unitarias con PowerMock?
code coverage (1)
En este momento, Android Studio integra jacoco automáticamente para hacer cobertura de código.
Solo necesitas agregar algunas líneas de código:
apply plugin: ''jacoco-android''
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
Más información aquí:
Problema
Estoy configurando la cobertura del código de prueba unitaria para una biblioteca de Android que utiliza Robolectric para ejecutar las pruebas y PowerMock / Mockito para realizar pruebas simuladas.
Sin embargo, la ejecución de pruebas unitarias con Cobertura da como resultado la siguiente Excepción ...
: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 ninguna cobertura.
Al ejecutar el mismo testcase sin PowerMock *, las pruebas se ejecutan bien y el informe de cobertura se genera con éxito:
* Es decir, comentar las pruebas con PowerMock, eliminar la anotación de PowerMockIgnore
, la PowerMockRule
y la MockitoAnnotations.initMocks(this);
invocación.
Investigación
- Veo que algunos usuarios solucionaron un problema similar al establecer
forkmode="once"
en su prueba.
Sin embargo, esta no es la solución, ya que estoy usando Gradle, que por defecto en los proyectos de Java esForkMode.ONCE
. - Otros usuarios que informaron un problema similar lo solucionaron al actualizar PowerMock a 1.5.4 .
Intenté degradar a esta versión, pero el problema continúa. - Finalmente, se solucionó un problema similar especificando explícitamente una dependencia de
cobertura-runtime
, pero agregando que tampoco cambiaba nada.
Pregunta
¿Es posible utilizar Cobertura junto con PowerMock?
- En ese caso, ¿qué me falta?
- De lo contrario, ¿cómo debo medir la cobertura del código con una configuración de este tipo (Android Library + Robolectric + PowerMock)?