menu
書いてる野郎
orebike@gmail.com
Spring Boot ではアプリケーションの基本的な設定が
src/main/resources/application.yml
に格納されているが、本番とテストでは環境を変えたいことが普通である。 このような場合、この application.yml をコピーして
src/main/resources/application-test.yml
を作ればよい。
そしてテスト時にこのように記述し、application-test.yaml 側を明示的に読み込むようにする。
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.NONE) @ActiveProfiles("test") public class CustomerDaoTest { }
application-hoge.yml を作れば、 @ActiveProfiles(“hoge”)
で読み込める仕組みなので、
テスト状況の数だけ自由に設定を切り替えることができる。
Spring Boot の設定では何もしなければパッケージの根本にある Application.java つまり @SpringBootApplication
アノテーションでマークされているクラスの設定に基づいて動く。
この SpringBootApplication は配下のパッケージ中の指定されているクラスをすべてスキャンしてコントロール下に入れるので単にテストするだけだと少々オーバーな感じになってしまう。
特にそのコントロール対象が多いとテストではその実行に問題が出てくる可能性がある。
例えば Controller のクラスが HttpSession を Autowired していた場合。 これの実行時に HttpSession が必要になるわけであるが、この HttpSession インスタンスは Webサーバ由来なので起動に Webサーバの環境が必要になる。単にデータベースのアクセスをテストしたいだけなのにアプリを起動するのに Webサーバが必要な状況になってしまう。
ここでより下位のテストパッケージ内に SpringBootApplication でマークした不要な設定を除外したクラスを用意することでそちらが優先されて根本にある本番用の SpringBootApplication は読み込まれなくなり依存性を限定してテストを起動することができるようになる。