0

統合テストの作業を開始して以来、プロジェクトで発生している奇妙な問題の解決に取り組んでいます。「jetty-maven-plugin」を使用してアプリケーションのインスタンスを起動すると、「maven-failsafe-plugin」が統合テストの実行を開始します。これだけのセットアップと実行が可能です。

私が今やろうとしているのはこれです: テストを実行するためのいくつかのフィクスチャをセットアップできるように、サービス層を処理したいと思います。これまでの統合テストは非常に単純なものでしたが、もう少しレベルを上げて、実際のフォームへの入力などをテストしたいと思います。これが機能するには、いくつかのフィクスチャをセットアップしてから、これらのテストを再現できるようにそれらを削除できる必要があります。この目的のためだけに使用するテスト データベースに対して実行しています。

私が読んだことから、これは不合理ではありません。それにもかかわらず、実際にテストを実行すると、非常に奇妙なエラー メッセージとスタック トレースが表示されます。私が知る限り、Maven は Jetty で問題なくアプリケーションを起動します。次に、フェイルセーフ プラグインがテストの実行を開始し、最初の統合テストに到達すると、Spring インスタンスとコンテキストのインスタンス化を開始します。プロパティと構成ファイルを正しくプルしますが、実際にサービス オブジェクトを挿入しようとすると、次のエラーが表示されます。

原因: org.springframework.beans.factory.BeanDefinitionSt oreException: Unexpected exception parsing XML document from class path resource [app-config.xml]; ネストされた例外は org.springframework.context.annotation.Conflicting BeanDefinitionException: Annotation-specified bean name 'pesticideRoleRepositoryImpl' for bean class [dao.role.PesticideRoleRepositoryImpl] は、同じ名前とクラス [dao.role] の既存の互換性のない Bean 定義と競合します.PesticideRoleRepositoryImpl]

すべてのスタック トレースは割愛します。いつでも利用できるようにします。;-)

私はこれがすべて間違っているのではないかと思い始めたので、戻ってほぼ同じ方法でテストプロジェクトをセットアップしました. テスト プロジェクトははるかに単純で、この問題はありません。統合テストを実行すると、サービス オブジェクトが問題なく挿入されます。興味のある方は、私のテスト プロジェクトを GitHub でご覧ください。

私の質問はこれです...

誰もこのエラーを見たことがありますか? Spring でこのような問題が発生する条件はありますか?

この種の統合テストでは、まったく同じ構成を使用する 2 つの Spring コンテナーが作成されることは明らかです。これが問題かもしれないと思いましたが、テスト プロジェクトは同じように機能し、この問題はありません。また、名前とクラスが同じ Bean が 2 つあるにもかかわらず、Spring はそれらが互換性がないと認識していることにも悩まされています。

ありがとう、どんな助けでも大歓迎です!:-D

4

2 に答える 2

0

このエラーは、2 つの異なるファイルに同じクラス (Bean) 定義が含まれていて、互換性がない場合に発生します。oldBeanDefintion.equals(newBeanDefinition) == false

あなたはチェックすることができます:

  • スキャナがこのクラスを 2 回ロードしている理由。
  • なぜ oldBeanDefintion.getSource().equals(newBeanDefinition.getSource()) = false
  • なぜ oldBeanDefinition.equals(newBeanDefinition) = false

ClassPathBeanDefinitionScanner.isCompatible()または extendsメソッドにブレークポイントを設定してメソッドをClassPathBeanDefinitionScannerオーバーライドisCompatibleし、有用な情報をログに記録してエラーを見つけることができます。

最後のオプションとして、XMLBeanDefinitionsはスキャンされたものでオーバーライドできないため、XML で Bean を定義すると、同じ Bean 名を持つスキャンされたクラスは無視されます。

于 2013-03-23T21:00:56.213 に答える