4

私は春とMavenが初めてです。そして最近、Spring MVC プロジェクトをビルドし、maven を使用してプロジェクト構造と依存関係を管理しています。

単体テストを作成すると、「src/main/java」から Bean を取得できないという問題が発生し、コンテキストは「src/test/java」からのみ Bean をロードするようです。

これが私のコードです。

単体テスト: src/test/java/com/web/component/form

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:META-INF/spring/applicationContext-web-test.xml"})
public class FormTest { 
    @Autowired
    private BeanFactory beanFactory; // I override this bean by myself
}

構成 XML ファイル: src/test/resources/META-INF/spring/applicationContext-web-test.xml ここで、次のコンポーネント スキャンは、src/test/java で定義された Bean のみをスキャンし、src/main/java ではスキャンしないようです。

<context:component-scan base-package="com.web">
    <context:exclude-filter expression=".*_Roo_.*" type="regex"/>
    <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>

オーバーライド BeanFactory クラスは src/main/java/com/web/helper/ にあります。

エラー:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.web.helper.BeanFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
    ... 41 more

それで、コンポーネントスキャンを変更して、Spring Mavenユニットテストでsrc/test/javaの代わりにsrc/main/javaで定義されたBean/クラスをスキャンする方法があることを尋ねたいですか?

4

3 に答える 3

1

BeanFactory実装するにはBeanFactoryAware

于 2012-12-05T02:11:23.297 に答える
1

他の誰かが言及したように、コンポーネント スキャン内にソース フォルダーを含めません。

Maven は、src/test/java および src/main/java のクラスをクラスパスに自動的に追加します。その順番で。

したがって、問題は BeanFactory 実装が原因である可能性があります。BeanFactory 実装にデフォルトのコンストラクターがあり、正常に作成されていることを確認してください。順序付けを強制するには、@DependsOn アノテーションを付けることができます (ただし、これが問題だとは思いません)。

于 2013-07-18T15:10:33.647 に答える
1

通常のアプリケーション コンテキストをテスト context.xml にインポートしてみましたか? このような:

<import resource="classpath:applicationContext.xml" /> 

ただし、これはおそらくいくつかの問題を引き起こします ( Springockitoは、不要な Bean をモックに簡単に置き換えるのに役立ちます)。

私はそのような問題に遭遇したことを覚えていません。しかし、Spring には、リソースのクラスパス宣言でのワイルドカードに関していくつかの制限があります。コンポーネント スキャンでのワイルドカードも同様に制限されているのではないでしょうか? 私は通常、テストでインポーターになっている基本コンテキストをいくつか持っているので、コンポーネントスキャンはそこに設定されています。

答えは見つかりましたか?

于 2013-07-17T19:20:14.863 に答える