質問
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)