android – 我可以在PowerMock上使用Cobertura进行单元测试吗?

问题

我正在为使用Robolectric运行测试和PowerMock / Mockito进行模拟测试的Android库设置单元测试代码覆盖率。

然而,与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 report with PowerMock

在没有PowerMock *的情况下运行相同的测试用例,测试运行正常,报告生成成功:
Cobertura report without PowerMock

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

调查

>我看到一些用户fixed a similar issue通过在他的测试中设置forkmode =“once”。
但是,这不是我使用Gradle which defaults on Java projectsForkMode.ONCE的解决方案。
>其他用户举报类似的问题fixed it by updating PowerMock to 1.5.4
我试着降级到这个版本,但问题依然存在。
>最后,explicitly specifying a dependency to cobertura-runtime修复了一个类似的问题,但添加它也没有改变任何东西。

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

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

现在,Android Studio自动整合jacoco来做代码覆盖。

你只需要添加几行代码:

apply plugin: 'jacoco-android'
android {
   buildTypes {
      debug {
         testCoverageEnabled = true
      }
   }
}

更多信息:

> http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/

http://stackoverflow.com/questions/36285115/can-i-use-cobertura-on-unit-tests-with-powermock

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:android – 我可以在PowerMock上使用Cobertura进行单元测试吗?