大佬教程收集整理的这篇文章主要介绍了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
}
}
首先,我多年来一直在与 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}}。 作为一种解决方法,您可以:
TESTCoverageEnabled true
请注意,这仅在撰写此答案时有效,希望 Google 将来能解决此问题。
以上是大佬教程为你收集整理的Kotlin JaCoCo - IllegalClassFormatException。请提供原始的非仪器类全部内容,希望文章能够帮你解决Kotlin JaCoCo - IllegalClassFormatException。请提供原始的非仪器类所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。