程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Kotlin JaCoCo - IllegalClassFormatException。请提供原始的非仪器类大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Kotlin JaCoCo - IllegalClassFormatException。请提供原始的非仪器类?

开发过程中遇到Kotlin JaCoCo - IllegalClassFormatException。请提供原始的非仪器类的问题如何解决?下面主要结合日常开发的经验,给出你关于Kotlin JaCoCo - IllegalClassFormatException。请提供原始的非仪器类的解决方法建议,希望对你解决Kotlin JaCoCo - IllegalClassFormatException。请提供原始的非仪器类有所启发或帮助;

我正在尝试获取我们的 AndroID 应用程序模块的测试覆盖率报告并执行 testvariantBuildTypeUnitTest 任务。

尽管所有测试都通过了,TEST-classnameTest.xml 文件包含以下错误消息。此错误仅适用于包含从 Kotlin 调用 Java 的方法。这个问题有解决方案吗?

**Caused by: java.lang.IllegalStateException: CAnnot process instrumented class... Please supply original non-instrumented classes.
at org.jacoco.agent.rt.internal_f3994fa.core.internal.instr.instrSupport.assertnotinstrumented(instrSupport.java:238)
at org.jacoco.agent.rt.internal_f3994fa.core.internal.instr.Classinstrumenter.visitFIEld(Classinstrumenter.java:56)
at org.jacoco.agent.rt.internal_f3994fa.asm.Classvisitor.visitFIEld(Classvisitor.java:339)
at org.jacoco.agent.rt.internal_f3994fa.asm.ClassReader.readFIEld(ClassReader.java:1111)
at org.jacoco.agent.rt.internal_f3994fa.asm.ClassReader.accept(ClassReader.java:713)
at org.jacoco.agent.rt.internal_f3994fa.asm.ClassReader.accept(ClassReader.java:401)
at org.jacoco.agent.rt.internal_f3994fa.core.instr.instrumenter.instrument(instrumenter.java:90)
at org.jacoco.agent.rt.internal_f3994fa.core.instr.instrumenter.instrument(instrumenter.java:108)

我们有一个多模块 androID 项目,因此我们使用这个自定义 Jacoco 任务来获取覆盖率报告:

project.afterEvaluate {

    (androID.hasProperty('applicationVariants')
            ? androID.'applicationVariants'
            : androID.'libraryVariants')
            .all { variant ->
                def variantname = variant.name
                def unitTestTask = "test${variantname.cAPItalize()}UnitTest"

                def jacocoReportname = unitTestTask + project.name

                tasks.create(name: jacocoReportname,type: JacocoReport,dependsOn: [
                        "$unitTestTask"
                ]) {
                    group = "ReporTing"
                    description = "Generate Jacoco coverage reports for the ${variantname.cAPItalize()} build"

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

                    def fileFilter = [
                            // data binding
                            'androID/databinding/**/*.class','**/androID/databinding/*Binding.class','**/androID/databinding/*','**/androIDx/databinding/*','**/databinding','**/BR.*',// androID
                            '**/R.class','**/R$*.class','**/BuildConfig.*','**/Manifest*.*','**/*Test*.*'
                    ]

                    def javaClasses = filetree(dir: variant.javaCompileProvIDer.get().desTinationDir,excludes: fileFilter)
                    def kotlinClasses = filetree(dir: "${BuildDir}/tmp/kotlin-classes/${variantnamE}",excludes: fileFilter)

                    classDirectorIEs.setFrom(files([
                            javaClasses,kotlinClasses
                    ]))

                    def variantsourceSets = variant.sourceSets.java.srcDirs.collect { it.path }.flatten()
                    sourceDirectorIEs.setFrom(project.files(variantsourceSets))

                    if (isAndroIDlibrary(project)) {
                        executionData(files([
                                "${projectDir}/jacoco.exec"
                        ]))
                    }else{
                        executionData(files([
                                "$project.buildDir/jacoco/${project.namE}.exec"
                        ]))
                    }

                }

            }
}

问候,

解决方法

解决方案

问题很可能出在您的模块级别 build.gradle 文件中。您需要删除 TESTCoverageEnabled 或将其设置为 false。

android {
 ...
  buildTypes {
     release {
        minifyEnabled true
     }
     debug {
        // TESTCoverageEnabled true 
        minifyEnabled false
     }
  }

说明和参

    @H_675_48@

    首先,我多年来一直在与 JaCoCo 一起努力解决 android 上的单元测试覆盖率问题,并且随着 AGP(Android Gradle 插件)团队增强了 AGP(例如 Similar issue),因此多次多次遇到这些问题此解决方案可能会在 AGP 的未来版本中发生变化。

    @H_675_48@

    AGP 4.1 的 release 来了,AGP 团队改变了插件处理单元测试的方式。我向 AGP 团队提出了一个 enter link description here 问题,他们解释说该插件 (AGP 4.1+) 以自己的形式进行检测以获得覆盖范围,这无疑与 JaCoCo 不兼容。正是在这个问题中,我向我强调了解决方案。

注意 1:此问题在 DSL 文档中not documented

注意 2:还应该注意的是,截至我撰写此 AGP 7 时,该 AGP 7 正在开发中,其中发生了相同的问题。

注意事项

此解决方案将导致生成插装测试覆盖率的问题,因为 AGP 生成插装测试的覆盖率(以 .ec 文件的形式),这意味着要获得您必须拥有的插装测试覆盖率 {{ 1}}。 作为一种解决方法,您可以:

    @H_675_48@将您的单元测试放在发布构建变体中 @H_675_48@将您的检测测试放在调试构建变体中。 仍然可以将覆盖范围合并到一份报告中:例如:
TESTCoverageEnabled true
    @H_675_48@这假设您在 ui 目录中有任何 UI 代码。 @H_675_48@包括除 ui 目录之外的所有发布类 @H_675_48@您只包含您的 ui 调试类。

请注意,这仅在撰写此答案时有效,希望 Google 将来能解决此问题。

大佬总结

以上是大佬教程为你收集整理的Kotlin JaCoCo - IllegalClassFormatException。请提供原始的非仪器类全部内容,希望文章能够帮你解决Kotlin JaCoCo - IllegalClassFormatException。请提供原始的非仪器类所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。