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.
esecuzione la stessa testcase senza PowerMock *, i test eseguiti bene e il rapporto di copertura è generato con successo:
* cioè commentando i test utilizzando PowerMock, rimuovendo il PowerMockIgnore
annotazione, la PowerMockRule
e l'invocazione MockitoAnnotations.initMocks(this);
.
Investigation
- vedo che alcuni utenti fixed a similar issue impostando
forkmode="once"
nel suo testsuite.
Tuttavia, questa non è la soluzione poiché sto utilizzando Gradle which defaults on Java projects aForkMode.ONCE
. - Altri utenti che segnalano un problema simile fixed it by updating PowerMock to 1.5.4.
Ho provato il downgrade a questa versione, ma il problema rimane. - Infine, un problema simile è stato risolto da explicitly specifying a dependency to
cobertura-runtime
, ma l'aggiunta non ha modificato nulla.
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)?
Sto avendo lo stesso problema. Gradle build, i test di Powermock si presentano con una copertura dello 0%. Mi piacerebbe averlo risolto. – jjNford
+1 per la tua domanda molto chiara. Potresti condividere un progetto di base che riproduce il problema (su github per esempio)? – gontard
Nei casi di test si sta estendendo la classe da PowerMockTestCase? –