我可以在PowerMock的单元测试中使用Cobertura吗?

PLN*_*ech 29 android unit-testing cobertura powermock robolectric

问题

我正在为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
Run Code Online (Sandbox Code Playgroud)

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


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

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


调查


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

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

TeR*_*RRo 1

目前,Android Studio 自动集成了jacoco来进行代码覆盖。

您只需要添加几行代码:


apply plugin: 'jacoco-android'
Run Code Online (Sandbox Code Playgroud)
android {
   buildTypes {
      debug {
         testCoverageEnabled = true
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

更多信息请点击这里: