jacoco:对于报告生成,必须在运行时使用相同的类文件

时间:2015-11-04 09:13:55

标签: java android gradle powermock jacoco

我一直在研究android项目,并使用roboletric和powermock来完成unitTest。

当我运行gradle jacocoTestReport时,它会显示

[ant:jacocoReport] Classes in bundle 'app' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class com/my/app/MyClass does not match.

我使用powermock来模拟Myclass.java中的静态方法

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
@PrepareForTest(MyClass.class)
public class TheTest {

    @Rule
    public PowerMockRule rule = new PowerMockRule();

    @Test
    public void test1() throws Exception {
        PowerMockito.mockStatic(MyClass.class);
        // do something
    }
}

build.gradle如下所示

apply plugin: 'jacoco'
def coverageSourceDirs = [
         '../app/src/main/java'
]

task jacocoTestReport(type:JacocoReport, dependsOn: "testDebugUnitTest") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports"

    classDirectories = fileTree(
            dir: '../app/build/intermediates/classes/debug',
            excludes: ['**/R.class',
                       '**/R$*.class',
                       '**/*$ViewInjector*.*',
                       '**/BuildConfig.*',
                       '**/Manifest*.*']
    )

    additionalSourceDirs = files(coverageSourceDirs)
    sourceDirectories = files(coverageSourceDirs)
    executionData = files('../app/build/jacoco/testDebugUnitTest.exec')

    reports {
        xml.enabled = true
        html.enabled = true
    }

}

我仍然可以看到覆盖率报告而没有失真。

但如何摆脱这种警告?

谢谢。

3 个答案:

答案 0 :(得分:5)

当您使用Java版 X 编译类并运行测试(jacoco)但运行 jacocoTestReport 任务(在Gradle中)时会发生这种情况,使用另一个Java版本,即Java Y

您是在设置不同的JAVA版本还是使用不同的Gradle(使用不同的JAVA)?当您看到关于类xxx / yyy / zzz的执行数据的此警告/错误消息不匹配时,您可能会获得部分覆盖,这意味着它将反映0%的覆盖率。

解决以下问题:

[ant:jacocoReport] Classes in bundle 'app' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class com/my/app/MyClass does not match.

确保:

  1. You JAVA版本在运行时是相同的#34; gradle clean build"或者" gradle integrationTest"或者" gradle someKindOfnonUnitTest" (在Tomcat之类的外部容器之后)以及使用jacoco使用jacocoTestReport任务生成覆盖率报告。
  2. ,如果上述内容没有帮助,

    1. 在跑步" gradle jacocoTestReport" (假设您在工作区中有Unit / NonUnit测试的有效.exec文件),请传递一些命令行开关,如下所示。
    2. 例如:

      gradle clean build 
      gradle ...some..nonUnitTestTask
      

      然后

      gradle jacocoTestReport -x test -x testClasses -x compileJava -x classes
      

答案 1 :(得分:0)

当我尝试运行与jacocoTestReport任务分开的test任务时,我遇到了这个问题,而不是不同的Java版本,只是过时的类。

一种解决方法是确保获得全新构建和新的测试运行:

$ gradle clean && gradle test && gradle jacocoTestReport

另一种方法是创建一个按顺序运行testjacocoTestReport的复合任务。在build.gradle

task coverage {
  dependsOn 'test'
  dependsOn 'jacocoTestReport'
  tasks.findByName('jacocoTestReport').mustRunAfter('test')
}

我是JaCoCo的新手,我觉得这应该更容易,但这对我有用。

答案 2 :(得分:0)

如果您使用的是IntelliJ + Maven,请尝试此

转到文件->使缓存无效/重新启动