1

WebアプリケーションでCoberturaコードカバレッジ記録を使用したいのですが、機能させることができません。3つすべてがASMlibを使用してバイトコード操作を行うため、問題はSpringまたはHibernateとCoberturaの間の競合であると思われます。

私は次のことをしました:

  • CoberturaAntタスクを使用してjarを「WEB-INF/lib」にインストルメントし、「cobertura.ser」ファイルを生成しました
  • 「WEB-INF/lib」に「cobertura.jar」を追加しました
  • tomcatがcoberturaファイルの場所を提供し始めます(net.sourceforge.cobertura.datafile = cobertura.ser)

Tomcatを起動すると、Springコンテキストが初期化されるときに次のエラーメッセージが表示されます。

java.lang.NoSuchMethodException: com.foo.MyClass.setInstance($Proxy28)
  at com.foo.common.runtime.spring.PluginInjector.findBestMatchingMethod(PluginInjector.java:252)
  at com.foo.common.runtime.spring.PluginInjector.invokeMethod(PluginInjector.java:198)
  at com.foo.common.runtime.spring.PluginInjector.afterPropertiesSet(PluginInjector.java:174)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)

coberturaに付属するasm.jarをクラスパスに含めるべきではないことはすでに知っているので、cobertura.jarをWEB-INF\libにコピーしただけです。

その上、私もエマを試しました、そしてそれは働きました。ただし、coberturaはより現代的でアクティブに見え(2005年ではなく2010年からの最終更新)、より良いレポートを生成するので、Emmaよりも好むでしょう。

4

1 に答える 1

0

この作業を行うには、2つの変更を加える必要がありました。

  1. Spring構成で設定proxy-target-class="true"する必要があったため、SpringはJDK動的プロキシを使用する代わりにCGLIBを使用してプロキシを生成します(Springプロキシメカニズムを参照)。

  2. JVMパラメータを設定する必要が-XX:-UseSplitVerifierありました。これにより、JVMは古いバイトコードベリファイアを使用します。Coberturaのバイトコード操作はJava7と互換性がないため、これが必要と思われます。

于 2013-02-06T10:28:29.530 に答える