2016-03-29 19 views
22

Problema

sto istituzione di copertura di codice unità di prova per una libreria che utilizza Android Robolectric per eseguire i test e PowerMock/Mockito per mock-test.Posso usare Cobertura sui test unitari con PowerMock?

Tuttavia, l'esecuzione unità di test con Cobertura risultati nel seguente eccezione ...

: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 

... e la relazione Cobertura generato mostra alcuna copertura a tutti. Cobertura report with PowerMock


esecuzione la stessa testcase senza PowerMock *, i test eseguiti bene e il rapporto di copertura è generato con successo: Cobertura report without PowerMock

* cioè commentando i test utilizzando PowerMock, rimuovendo il PowerMockIgnore annotazione, la PowerMockRule e l'invocazione MockitoAnnotations.initMocks(this);.


Investigation


Domanda

E 'possibile utilizzare in combinazione con Cobertura PowerMock?

  • In tal caso, cosa mi manca?
  • In caso contrario, come devo misurare la copertura del codice con tale impostazione (Android Libreria + Robolectric + PowerMock)?
+1

Sto avendo lo stesso problema. Gradle build, i test di Powermock si presentano con una copertura dello 0%. Mi piacerebbe averlo risolto. – jjNford

+1

+1 per la tua domanda molto chiara. Potresti condividere un progetto di base che riproduce il problema (su github per esempio)? – gontard

+0

Nei casi di test si sta estendendo la classe da PowerMockTestCase? –

risposta

-2

In questo momento, Android Studio integra automaticamente jacoco per eseguire la copertura del codice.

Hai solo bisogno di aggiungere alcune righe di codice:


apply plugin: 'jacoco-android' 

android { 
    buildTypes { 
     debug { 
     testCoverageEnabled = true 
     } 
    } 
} 

Maggiori informazioni qui:

+1

Ho provato la soluzione, ma l'aggiunta di jacoco e l'esecuzione di createDebugCoverageReport genera [un report vuoto] (http://i.stack.imgur.com/ACTcY.png). A parte questo, sei sicuro che jacoco funzioni per unit-test ('test') e non solo per Instrumentation Testing (' androidTest')? L'articolo che hai linkato è quest'ultimo, mentre sto cercando di raggiungere il primo * con Robolectric *. – PLNech