为了获得代码覆盖率报告,我通过 cobertura maven 插件对 @Decorator bean 进行了检测。在 OpenEJB 容器中运行我的单元测试时。容器在启动期间报告了一些错误(新的初始上下文)。
引起:org.apache.webbeans.exception.WebBeansConfigurationException:装饰器:MyDecorator,名称:null,WebBeans 类型:DECORATOR,API 类型:[org.apache.commo ns.configuration.Configuration,net.sourceforge.cobertura.coveragedata.HasBeenInstrumented ,org.apache.commons.configuration.AbstractConfiguration,MyDecorator,org.apache.commons.configuration.event.EventSource,java.lang.Object],限定符:[javax.enterprise.inject.Any,javax.enterprise.inject.Default ] 代表必须实现所有装饰器装饰类型,但装饰器类型接口 net.sourceforge.cobertura.coveragedata.HasBeenInstrumented 不能从接口 org.apache.commons.configuration.Configuration 的委托类型分配
细节:
我有一个装饰器要进行单元测试。就像是
导入 org.apache.commons.configuration.AbstractConfiguration;
导入 org.apache.commons.configuration.Configuration;
@装饰器
公共类 MyDecorator 扩展 AbstractConfiguration {
@Inject
@Delegate
private Configuration conf;
......
}
在 cobertura 检测之后,代码如下:(我反编译)
导入 net.sourceforge.cobertura.coveragedata.HasBeenInstrumented;
@装饰器
公共类 MyDecorator 扩展 AbstractConfiguration 实现 HasBeenInstrumented {
@Inject
@Delegate
private Configuration conf;
......
}
如您所见,cobertura 为我的装饰器增加了一个界面。当 OpenEJB 加载和部署这个检测类时,会报错:
引起:org.apache.webbeans.exception.WebBeansConfigurationException:装饰器:MyDecorator,名称:null,WebBeans 类型:DECORATOR,API 类型:[org.apache.commo ns.configuration.Configuration,net.sourceforge.cobertura.coveragedata.HasBeenInstrumented ,org.apache.commons.configuration.AbstractConfiguration,MyDecorator,org.apache.commons.configuration.event.EventSource,java.lang.Object],限定符:[javax.enterprise.inject.Any,javax.enterprise.inject.Default ] 代表必须实现所有装饰器装饰类型,但装饰器类型接口 net.sourceforge.cobertura.coveragedata.HasBeenInstrumented 不能从接口 org.apache.commons.configuration.Configuration 的委托类型分配
错误日志说 @Decorator 和 @Delegate 应该实现相同的类型。但是在instrument之后,待测类多了一个接口。
然后我尝试检测 org.apache.commons.configuration.AbstractConfiguration 和 org.apache.commons.configuration.Configuration。(通过 cobertura 命令行检测 commons-configuration-1.9.jar)并修改我的代码,如:
@装饰器
公共类 MyDecorator 扩展 AbstractConfiguration {
@Inject
@Delegate
private AbstractConfiguration conf;
......
} //我使用 AbstractConfiguration 而不是 Configuration,因为 Configuration 是一个 //无法检测的接口。
经过这一切,问题就解决了。但这不是一个好方法。
根本原因是 maven cobertura 插件通过向原始类添加接口来识别类文件,我适用于大多数情况。但不适用于在容器中运行的 @Decorator bean。
我应该为 maven-cobertura-plugin org 创建评论吗?
有人对如何对@Decorators 进行单元测试有一些建议。并且容易获得覆盖率报告?可能是我的单元测试没有以好的方式实现,也许 openejb 不适合这个?
通常你如何对你的@Decorators 进行单元测试?