我可以在PowerMock的unit testing中使用Cobertura吗?

问题

我正在为Android库设置unit testing代码覆盖率,该库使用Robolectric运行测试, PowerMock / Mockito用于模拟测试。

但是,使用Cobertura运行unit testing会导致以下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.(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.(TouchCollector.java:45) ... 11 more 

……并且生成的Cobertura报告根本没有显示任何报道。 Cobertura向PowerMock报告


在没有PowerMock *的情况下运行相同的测试用例,测试运行正常并且成功生成覆盖率报告: 没有PowerMock的Cobertura报告

*即使用PowerMock评论测试,删除PowerMockIgnore注释, PowerMockRuleMockitoAnnotations.initMocks(this); 调用。


调查

  • 我看到一些用户通过在他的测试套件中设置了“ forkmode="once"来解决类似的问题 。
    但是,这不是解决方案,因为我使用的是Gradle ,Java项目默认为ForkMode.ONCE
  • 报告类似问题的其他用户通过将PowerMock更新为1.5.4来修复此问题。
    我尝试降级到这个版本,但问题仍然存在。
  • 最后,通过显式指定对cobertura-runtime的依赖性来修复类似的问题,但添加它也没有改变任何东西。

是否可以将Cobertura与PowerMock结合使用?

  • 在那种情况下,我错过了什么?
  • 否则,我应该如何使用这样的设置(Android Library + Robolectric + PowerMock)来测量代码覆盖率?

Solutions Collecting From Web of "我可以在PowerMock的unit testing中使用Cobertura吗?"