首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Gradle + Jacoco会抛出属于JAXB类的异常?

为什么Gradle + Jacoco会抛出属于JAXB类的异常?
EN

Stack Overflow用户
提问于 2016-04-22 14:42:47
回答 2查看 616关注 0票数 2

我是刚认识Jacoco的我才刚接上Gradle。

因此,在子项目中,我只有:

代码语言:javascript
复制
apply plugin: jacoco

当我运行gradle test时,我得到:

代码语言:javascript
复制
Caused by: javax.xml.bind.JAXBException: An Error Occurred While Scanning Context Classes!
 - with linked exception:
[java.lang.NoSuchMethodException: Failed to Locate Method for Element, Name = $jacocoData, MethodName = set$jacocoData, Type = class com.someco.components.thing.stuff.Feedback, Argument Type = class [Z]
    at javolution.xml.internal.annotation.JAXBAnnotatedObjectReaderImpl.<init>(JAXBAnnotatedObjectReaderImpl.java:98)
    at javolution.xml.internal.annotation.JAXBAnnotationFactoryImpl.createJAXBAnnotatedObjectReader(JAXBAnnotationFactoryImpl.java:31)
    at com.someco.commons.util.JaxbUtils.unmarshal(JaxbUtils.java:112)
    ... 47 more
Caused by: java.lang.NoSuchMethodException: Failed to Locate Method for Element, Name = $jacocoData, MethodName = set$jacocoData, Type = class com.someco.components.thing.stuff.Feedback, Argument Type = class [Z
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.getMethodByXmlName(AbstractJAXBAnnotatedObjectParser.java:533)
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.scanClass(AbstractJAXBAnnotatedObjectParser.java:281)
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.registerContextClasses(AbstractJAXBAnnotatedObjectParser.java:149)
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.registerContextClasses(AbstractJAXBAnnotatedObjectParser.java:143)
    at javolution.xml.internal.annotation.AbstractJAXBAnnotatedObjectParser.registerContextClasses(AbstractJAXBAnnotatedObjectParser.java:143)
    at javolution.xml.internal.annotation.JAXBAnnotatedObjectReaderImpl.<init>(JAXBAnnotatedObjectReaderImpl.java:93)
    ... 49 more
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-27 19:40:46

所以你需要2不包括在内。一个用于汇编,另一个用于报告。要解决这个特定的问题,您所需要的就是:

代码语言:javascript
复制
test {
    jacoco {
        excludes = [ "com.stuff.ours.jaxb.stuff.*",
                     "javolution.*"]
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-04-22 15:19:06

我没有为您提供解决方案,但是您的代码发生了什么变化。Jacoco动态地将字段和方法插入到类中,并使用它们来跟踪覆盖度量。如果您的代码使用反射,这可能是一个问题,因为jacoco的字段是在反射调用中返回的--除非您显式地将它们过滤掉。Jacoco常见问题说:

我的代码使用反射。为什么当我用JaCoCo?执行它时,它会失败? 为了收集执行数据,JaCoCo对被测试的类进行测试,这将向类添加两个成员:私有静态字段$jacocoData和私有静态方法$jacocoInit()。两个成员都被标记为合成的。 请更改您的代码以忽略合成成员。这是一个很好的实践,因为Java编译器在某些情况下也会创建合成成员。

现在,我不确定它是否允许在接收到的字段上应用过滤器,但这是我开始寻找的地方。

或者,您可以从jacoco中排除问题类/包,但请注意,您将不会度量排除在外的类/包的测试覆盖率。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36796828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档