8

複数の Spring Bean 定義 xml ファイルにまたがる大規模なアプリケーションがあります。私のテスト スイートでは、FileSystemXmlApplicationContext を使用して必要な XML ファイルを手動でロードし、実行したいテストを実行します。これにより、テストのセットアップ時間が短縮され、本番環境で使用されているのとまったく同じ構成ファイルを使用できるようになります。

今、私は Spring のトランザクショナル テスト基本クラスを使用しようとしています。このクラスは、構成の場所を取り、コンテキストをロードします。なんらかの理由で、アプリケーション コンテキストが作成されるときに、Spring が設定ファイルを見つけることができません。FileSystemXmlApplicationContext を使用して自分で構成をロードするときと同じ作業ディレクトリからテストを実行するため、これは混乱を招きます。すべての構成場所の前に「file:」を追加すると、テストで指定したパスが見つかりますが、構成で定義された Bean によってインポートまたは参照されるファイル (プロパティ ファイルなど) は見つかりません。どうしたんだ?Spring コンテキスト テスト クラスを拡張して、自分でコンテキストを作成した場合と同じように機能するテストを取得できますか?

たとえば、次のようなコンテキストを作成するとうまくいきます。

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WEB-INF/services-context.xml"})

AbstractTransactionalDataSourceSpringContextTests を拡張すると、以下は services-context.xml を見つけられません。

@Override
protected String[] getConfigLocations() {
   return new String[] { "WEB-INF/services-context.xml"};
}

これは services-context を見つけますが、そこで定義されている PropertyPlaceholderConfigurer はそのプロパティ ファイルを見つけることができません。

 @Override
 protected String[] getConfigLocations() {
    return new String[] { "file:WEB-INF/services-context.xml"};
 }
4

6 に答える 6

4

すべての Spring 構成ファイルとプロパティ ファイルをクラスパスに配置することで、物事をシンプルに保ちます。次のような基本クラスからテスト クラスを拡張するだけです。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
        "/spring/*.xml", 
        "/testSpring/*.xml" })
public abstract class AbstractIntegrationTest  {

ここで、パスはすべてクラスパス内のパスです。

それをしたくない場合は、services-context.xml でプロパティ ファイルを参照する方法を確認しましたか? file: をコンテキスト構成に追加する場合は、これをプロパティ ファイル参照にも追加する必要があると思います。別のテスト Spring 構成ファイルを使用して、プロパティ プレースホルダーの定義を変更し、これをコンテキスト ファイルのリストの最後に配置することもできます。その定義は、以前のファイルで定義されたものを上書きします。

于 2009-06-18T17:54:04.897 に答える
3

getConfigLocations のオーバーライドに加えて、loadContext もオーバーライドし、そこで信頼できる fileSystemXmlApplicationContext を使用しました。

 @Override
 protected String[] getConfigLocations() {
     return new String[] { "WEB-INF/services-config.xml" };
 }

 @Override
 protected ConfigurableApplicationContext loadContext(String[] locations) throws Exception {
     return new FileSystemXmlApplicationContext(locations);
  }
于 2009-06-17T21:31:27.017 に答える
1

構成の場所は相対 URI であり、ベース テスト クラスによってそのように解釈され、URI はテスト クラス自体の場所に対して相対的に解決されます。完全修飾 URI を使用するか、テスト クラスの場所を考慮して相対 URI を使用してください。

于 2009-06-17T21:01:24.567 に答える
1

ClassPathXmlApplicationContextのようなクラスパス XML ファクトリを使用できませんか?

于 2009-06-18T18:06:33.237 に答える
0

別の可能な解決策は、を複製しservices-config.xmlて名前を変更しservices-config-test.xml、クラスパスの下に置くことです。同じことがプロパティファイルにも当てはまります。

于 2011-04-17T16:08:23.880 に答える
0
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})
于 2012-06-25T08:50:18.960 に答える