0

为了获得代码覆盖率报告,我通过 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 进行单元测试?

4

1 回答 1

0

Cobertura 不检测接口。出于这个原因,建议将非插桩类放在插桩类之后的类路径中。

所以在instrumenting的时候,先用maven正常编译,然后把自己放到需要instrument的类的源码所在的目录下,然后运行如下命令:mvn cobertura:instrument。

这将使 cobertura 检测所有类,并且 maven 将自动添加未检测的文件。检测代码将位于“.\target\generated-classes\cobertura”。

你需要运行'jar -cvf [name-of-jar].jar *',然后你会得到你的检测 jar。

于 2013-01-30T10:32:40.293 回答