Problem
ja Ustawiając urządzenie-test pokrycia kodu dla Android, który wykorzystuje bibliotekę Robolectric uruchomić testy i PowerMock/Mockito dla makiety testów.Czy mogę używać Cobertury w testach jednostkowych z PowerMock?
Jednak prowadzenie testów jednostkowych z Cobertura skutkuje następującym wyjątkiem ...
: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
... a wygenerowany raport Cobertura pokazuje żadnego pokrycia w ogóle.
Uruchomienie samego testcase bez PowerMock *, testy działają dobrze, a zasięg jest generowany raport z powodzeniem:
* tj komentowania testów z wykorzystaniem PowerMock, usuwając PowerMockIgnore
adnotacji PowerMockRule
i wywołanie MockitoAnnotations.initMocks(this);
.
Investigation
- widzę, że niektórzy użytkownicy fixed a similar issue ustawiając
forkmode="once"
w jego TestSuite.
Jednak to nie jest rozwiązanie, ponieważ używam Gradle which defaults on Java projects doForkMode.ONCE
. - Inni użytkownicy zgłaszający podobny problem fixed it by updating PowerMock to 1.5.4.
Próbowałem zmienić klasyfikację na tę wersję, ale problem pozostaje. - Na koniec podobny problem został rozwiązany przez explicitly specifying a dependency to
cobertura-runtime
, ale dodanie go również niczego nie zmieniło.
Pytanie
Czy można używać w połączeniu z Cobertura PowerMock?
- W takim razie czego mi brakuje?
- W przeciwnym razie, w jaki sposób powinienem zmierzyć zasięg kodu przy takiej konfiguracji (Android Biblioteka + Robolectric + PowerMock)?
Mam ten sam problem. Konstrukcja Gradle, testy Powermock wykazują 0% pokrycia. Chciałbym, aby to rozwiązano. – jjNford
+1 za bardzo jasne pytanie. Czy możesz podzielić się podstawowym projektem odwzorowującym problem (na przykład na github)? – gontard
W teście przypadków testowych rozszerzasz klasę z PowerMockTestCase? –