オプション1(ベストプラクティスであるため、推奨され
ます):構成ファイルをリファクタリングWEB-INFし、共通部分(統合テストからもアクセスする)をに移動しsrc/main/resources/ます。次に、テスト固有の構成ファイルを書き込みますsrc/test/resources/(テストコンテキストをアセンブルするためにいくつかの異なる構成ファイルをインポートするだけでよい場合はsrc/main、これをスキップして、@ContextConfigurationできれば使用してください)。
オプション2(ハック):次
のような参照を使用します:
@ContextConfiguration("file:src/main/webapp/WEB-INF/dataSource.xml")
オプション3(ハック):
Mavenプロジェクトがある場合は、テストの実行中に追加のクラスパス要素としてmaven-surefire-plugin宣言するように(テストフェーズで使用)を構成できます。src/main/webapp
後者の2つのオプションは、下のファイルsrc/main/webappがクラスパス上にあるとは想定されていないため、ハックと見なされます。
今詳細な説明:
これらのファイルをそのまま参照できない理由classpath:/WEB-INF/*.xmlは、実際にはクラスパス上にないためです。Webアプリがどのようにパッケージ化されているか、そして何がクラスパスに正確に含まれるかを理解することが重要です。デフォルトのMavenプロジェクト構造を想定すると:
- からのJavaクラスはコンパイル後に
src/main/java移動します。/WEB-INF/classes
src/main/resourcesからのリソース/WEB-INF/classesも同様です。
- プロジェクトの依存関係はに移動し
/WEB-INF/libます。
- あなたが持っているものはすべて(パッケージのルート)に
src/main/webapp行きます。/これは、もちろん、からのすべてのファイルがsrc/main/webapp/WEB-INFに移動することを意味します。/WEB-INF
知っておくべき最も重要なことは、クラスパスには、の/WEB-INF/classesjarごとに1つのエントリしか含まれないということ/WEB-INF/libです。したがって、これら2つの場所の外部にあるリソースは、クラスローダーからは完全に見えません。これは、直下 のxml構成ファイルにも当てはまります。/WEB-INFそのため、参照classpath:/WEB-INF/dataSource.xmlは機能しません。
クラスパスから到達できない場合、これらのxml構成ファイルはSpringによってどのようにロードされるのでしょうか。答えは簡単です。(ユニット/統合テストだけを実行するのではなく)Webアプリケーションを起動すると、ServletContext(サーブレットAPIからの実際のクラス)へのアクセスを提供するサーブレットコンテナで実行されるため、ServletContext.getResourceAsStream()これらをロードするために使用されます。ファイル。理解するための鍵は、このメソッドのjavadocからの次の引用です。
このメソッドは、クラスローダーを使用するjava.lang.Class.getResourceAsStreamとは異なります。このメソッドを使用すると、サーブレットコンテナは、クラスローダーを使用せずに、任意の場所からサーブレットでリソースを利用できるようになります。
申し訳ありませんが、これは長すぎますが、それが全体の話です...