当前位置: 首页 > 知识库问答 >
问题:

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

易阳朔
2023-03-14

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

*即使用PowerMock注释测试,删除PowerMockIgnore注释、PowerMockRuleMockitoAnnotathtml" target="_blank">ions.initMocks(this);调用。

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

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

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

共有1个答案

顾光明
2023-03-14

现在,Android Studio自动集成jacoco来进行代码覆盖。

您只需要添加几行代码:

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

此处提供更多信息:

    null
 类似资料:
  • 那么为什么我不能像这样为它编写单元测试: 使用这种方法我会面临什么缺点?

  • 我正在为一个单例Java类编写单元测试(使用JUnit和Mockito)。我无法更改类实现本身。 使用PowerMockito,它是这样的(并且工作): 要求重写测试,而不使用PowerMock或PowerMockito或任何其他静态模拟API。由于我不能将单例类更改为使用依赖注入,我不确定什么是这样做的好方法。 任何帮助都将不胜感激。

  • 是否有人能够从Maven Build获得JaCoCo中JMockit和Powermock单元测试的复盖范围? 我有一个Powermock单元测试的现有测试集,我希望逐步将其迁移到JMockit。但是我需要能够在一个报告中看到所有单元测试的测试覆盖范围,最好是在Sonar中。 通过将JaCoCo置于“脱机”模式,我确实使JMockit和Powermock测试与Surefire/JaCoCo一起运行(

  • 我正在使用Sonarqube跟踪多模块Maven项目的单元和联调覆盖率。 这是在我进行更改之前,用于在本地生成Sonarqube报告的父pom.xml中的现有配置文件: 在Sonarqube本地生成所有单元测试覆盖范围的配置文件 当我运行 中使用了以下pom.xml: 父pom。由于NoClassDefFound错误而无法生成的xml 对于适当的pom.xml配置有什么想法,以使离线仪器能够在So

  • 我试图为我的类“Sinus”(用于计算浮点的Sinus)运行一个测试,但当我试图运行这个测试来生成我的Cobertura覆盖率报告时,它不起作用,我真的不知道为什么!你有什么建议或解释吗?(我使用cmd:mvn cobertura:cobertura) -这是我的测试: 结果是: 那有什么问题?有什么想法吗?这是我的pom。xml如下:

  • 我正试图在詹金斯的sonarqube仪表板上获取代码覆盖率报告。代码覆盖率报告即将发布,但仅显示4.6%的覆盖率。经过调查,我发现使用PowerMock编写的测试类被跳过了。 经过进一步调查,我发现“JaCoCo不能很好地处理动态修改/创建的类(这就是powermock的工作方式)。这是一个已知的限制,我们目前对此无能为力”。 是否有任何解决办法,以便我也可以为使用PowerMock编写的测试类获