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

标签 android unit-testing robolectric powermock cobertura

问题

我正在为一个 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 report with PowerMock


在没有 PowerMock* 的情况下运行相同的测试用例,测试运行良好,覆盖率报告生成成功: Cobertura report without PowerMock

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


调查


问题

是否可以将 CoberturaPowerMock 结合使用?

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

最佳答案

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

你只需要添加几行代码:


apply plugin: 'jacoco-android'

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

更多信息在这里:

关于android - 我可以在 PowerMock 的单元测试中使用 Cobertura 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36285115/

相关文章:

java - 如何缩短 Java/Android 中的代码?

android - Google Play 控制台 - 在封闭轨道之间切换

android - Android 中的 Activity 日历

unit-testing - 如何使用dart:html对简单的dart网络应用程序进行单元测试

unit-testing - clojure.test/are 与 clojure.test/testing

Android Robolectric Click RecyclerView Item

android - Android 上的 Robolectic 在哪里保存测试运行期间创建的文件?

为按钮生成选择器 xml 的 Android 工具

unit-testing - 使用 Jasmine 进行angular2测试订阅方法

Android Robolectric Gradle - java.lang.OutOfMemoryError : PermGen space