Springコンテキストテストは構成の場所を見つけることができません

StackOverflow https://stackoverflow.com/questions/1009357

  •  06-07-2019
  •  | 
  •  

質問

複数の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"};
 }
役に立ちましたか?

解決 2

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);
  }

他のヒント

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

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

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

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

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

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

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top