Подтвердить что ты не робот

Могу ли я использовать Cobertura на модульных тестах с PowerMock?

Проблема

Я настраиваю код модульного теста для библиотеки Android, которая использует Robolectric для запуска тестов и PowerMock/Mockito для макетирования.

Однако выполнение модульных тестов с Cobertura приводит к следующему исключению...

: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 не показывает никакого покрытия. Отчет Cobertura с PowerMock


Выполняя те же тестовые тесты без PowerMock *, тесты выполняются нормально и отчет о покрытии сгенерирован успешно: Отчет Cobertura без PowerMock

* т.е. комментируя тесты с помощью PowerMock, удаляя аннотацию PowerMockIgnore, вызов PowerMockRule и MockitoAnnotations.initMocks(this);.


Исследование


Вопрос

Можно ли использовать Cobertura совместно с PowerMock?

  • В таком случае, что мне не хватает?
  • В противном случае, как мне измерить покрытие кода такой настройкой (Android Library + Robolectric + PowerMock)?
4b9b3361

Ответ 1

В настоящий момент Android Studio автоматически интегрирует jacoco, чтобы сделать покрытие кода.

Вам просто нужно добавить несколько строк кода:


apply plugin: 'jacoco-android'

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

Дополнительная информация здесь: