Проблема
Я наладка покрытия модульного тестирования коды для Android библиотеки, которая использует Robolectric для запуска тестов и PowerMock/Mockito для макета тестирования.Могу ли я использовать Cobertura на модульных тестах с PowerMock?
Однако запуск юнит-тестов с Cobertura приводит к следующему Exception ...
: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
... и сгенерированный отчет Cobertura не показывает охват на всех.
Запуск же TestCase без PowerMock *, тесты прекрасно работают и отчет покрытие формируется успешно:
* т.е. комментируя тесты с использованием PowerMock, удаление PowerMockIgnore
аннотацию, то PowerMockRule
и вызов MockitoAnnotations.initMocks(this);
.
Исследование
- Я вижу, что некоторые пользователи fixed a similar issue, установив
forkmode="once"
в его тестах.
Однако это не решение, поскольку я использую Gradle which defaults on Java projects доForkMode.ONCE
. - Другие пользователи, представившие аналогичный вопрос fixed it by updating PowerMock to 1.5.4.
Я попытался понизить эту версию, но проблема остается. - И, наконец, аналогичная проблема была исправлена explicitly specifying a dependency to
cobertura-runtime
, но добавление ее ничего не изменило.
Вопрос
Можно ли использовать Cobertura в сочетании с PowerMock?
- В этом случае, что мне не хватает?
- В противном случае, как мне измерить покрытие кода такой установкой (Android Library + Robolectric + PowerMock)?
У меня такая же проблема. Gradle build, тесты Powermock показываются с охватом 0%. Хотелось бы решить эту проблему. – jjNford
+1 для вашего очень четкого вопроса. Не могли бы вы поделиться базовым проектом, воспроизводящим проблему (например, на github)? – gontard
В тестовых случаях вы расширяете класс из PowerMockTestCase? –