12

質問

Cobertura の計装は、特定のケースでスプリングの自動配線を壊しています。これを解決する方法を知っている人はいますか?

シナリオ

  • cobertura-maven-plugin バージョン 2.5.1 で MVN 3.0.4 を実行しています。
  • mvn テストは問題なく実行されます
  • mvn compile、package なども問題なく動作します。
  • mvn cobertura:cobertura も、2 つの新しい com.mycompany.executor executor クラスを含む多数の新しいクラスを導入する 2 つの新機能が追加されるまで、問題なく実行されました。(例: 既存の MyExecutor に加えて、MyHappyExecutor と MySadExecutor が追加されました)
  • Cobertura インストルメンテーション プロセスから MyExecutor を除外すると、自動配線が修正されるようです
  • 春の自動配線出力を確認すると、正しい Bean が自動配線されていることが確認されます。

障害点

myService の myExecutor の計測バージョンを自動配線しようとすると、自動配線が失敗します。これは、MyHappyExecutor と MySadExecutor を追加する前は問題なく機能していました。MyHappyExecutor と MySadExecutor は自動接続され、MyExecutor でのみ使用されます。

以下に例外出力を添付しました。クラス名とパッケージ名は編集されていないことに注意してください。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myService': Injection of autowired dependencies failed; 
nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.mycompany.executor.MyExecutor com.mycompany.service.impl.MyServiceImpl.myExecutor; 
nested exception is java.lang.IllegalArgumentException: Can not set com.mycompany.executor.MyExecutor field com.mycompany.service.impl.MyServiceImpl.myExecutor to $Proxy20

結論

Cobertura インストルメンテーション プロセスの何かが、Springs の自動配線を台無しにします。

更新 1

CGLIB クラス プロキシを強制すると、エラー タイプが「java.lang.NoClassDefFoundError」エラーに変わります。これは、Cobertura ゴールだけでなく標準テスト ゴールにも影響します。

<aop:config proxy-target-class="true"/>

更新 2

問題の 3 つのクラスのスプリング起動プロセスからの出力を次に示します。

2012-11-01 16:21:51 INFO  [main] Overriding bean definition for bean 'myExecutor': replacing [Generic bean: class [com.mycompany.executor.MyExecutor]; scope=; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [configuration.xml]] with [Generic bean: class [com.mycompany.executor.MyExecutor]; scope=; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [configuration.xml]] - (DefaultListableBeanFactory.java:623)
2012-11-01 16:21:51 INFO  [main] Overriding bean definition for bean 'happyExecutor': replacing [Generic bean: class [com.mycompany.executor.HappyExecutor]; scope=; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [configuration.xml]] with [Generic bean: class [com.mycompany.executor.HappyExecutor]; scope=; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [configuration.xml]] - (DefaultListableBeanFactory.java:623)
2012-11-01 16:21:51 INFO  [main] Overriding bean definition for bean 'sadExecutor': replacing [Generic bean: class [com.mycompany.executor.SadExecutor]; scope=; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [configuration.xml]] with [Generic bean: class [com.mycompany.executor.SadExecutor]; scope=; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [configuration.xml]] - (DefaultListableBeanFactory.java:623)
4

3 に答える 3

0

テストでは、設定する必要がありますproxyTargetClass=true

@EnableTransactionManagement(mode=AdviceMode.ASPECTJ, proxyTargetClass=true)

これがテストでは機能するが、アプリを実行すると失敗する場合は、テスト用とアプリ用に個別の構成が必要です。proxyTargetClass=true構成セットとアプリ構成セットのテストproxyTargetClass=false

エラーについてNoClassDefFoundErrorは、スタックトレースを確認する必要があります。おそらく spring-aop ライブラリが含まれていません

于 2012-11-07T02:55:15.297 に答える