src/main/resources下のファイルはsrc/test/resources下で上書きされる

Springなプロジェクトで、通常実行時はmain/resources下からBeanの設定を読み込み、JUnitテスト時だけはtest/resources下にある設定を読み込もうとしたらハマった時のメモ。ファイルの構成は以下のような感じ。

-src  
  |--main  
  |   `--resources  
  |       |--dataSource.xml
  |       |
  |       `--applicationContext.xml (dataSource.xmlを読み込む)
  |
  `--test  
      `--resources  
          `--dataSource.xml (テスト用DBへの接続設定)

これだとJUnit実行時のみtest/resources/dataSource.xmlの設定が読まれるのだと思っていたけど、どうも各resourcesディレクトリに同名のファイルが存在する場合、通常のアプリ実行・JUnit問わずtest/resources下のファイルが有効になるらしい。

では通常実行時にtest/resources/dataSource.xmlを読み込まないようにするのはどうするの?って事で探した対処法が以下。

1. src/test/resourcesをクラスパスから外す

まずこれ。test/resourcesにクラスパスが通っていると、こっちの下にあるファイルでmain/resources下の同名ファイルが上書きされるらしい。

2. resourcesディレクトリの名前を変更する

クラスパスから外してもテスト用の設定が上書きされてしまいハマった。どうやらsrc/test/resourcesというディレクトリは特別に扱われるらしく、クラスパスに入っていなくても設定ファイルを読み込む対象として扱われるらしい。なのでsrc/test/resource とかに名前変更。

3. pom.xmlでテストリソースの場所を指定

これで通常実行時にはmain/resources下の設定が読み込まれるはず。ただ、このままだとJUnitテスト時にもテスト用の設定が読み込めなくなるので、pom.xmlに以下のような設定を追加。

<testResources>
   <testResource>
       <directory>src/test/resource</directory>
       <includes>
           <include>**/*.xml</include>
       </includes>
   </testResource>
</testResources>

これでJUnit実行時のみsrc/test/resource下の設定が読み込まれるように。