2015年7月2日木曜日

Spring で MockMVC を使ったテストで Filter を使用する方法

概要

MockMvc のテストで Servlet の Filter を使用する方法を紹介します
MockMvc を使ったテスト環境の構築はこちらの記事を参考にして準備してください
また、Spring + Filter の使い方に関してはこちらを御覧ください

環境

  • Mac OS X 10.10.3
  • Eclipse Luna 4.4.1
  • Spring Framework 4.1.6
  • Spring Tool Suite 3.6.4
  • Java 1.8.0_31
  • Maven 3.2.1

Filter オブジェクトの作成

テスト用のクラスファイルに以下を追記します
@Autowiredを使ってクラスの作成と同時に Filter オブジェクトを生成します

@Autowired
private TestFilter testFilter;

フィルタの名前は自身の環境に合わせて適宜変更してください
また必要に合わせてimport文も定義してください

Beans として登録する

src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xmlに以下を追記します
@Autowiredで定義したフィルタオブジェクトをBeansの仕組みを使って生成するためです

<!-- for Filter -->
<beans:bean id="testFilter" class="com.sample.TestFilter">
</beans:bean>

MockMvc にフィルタを登録する

作成したフィルタをMockMvcのテスト時に使用するようにフィルタを追加します
MockMvc を WebApplicationContext から生成しているところで以下のようにフィルタを追加してください

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).addFilter(this.testFilter, "/").build();

addFilterメソッドを呼び出します
第一引数でフィルタを指定して第二引数でフィルタを適用するURLマッピングを指定します

動作確認

mvn package等でテストを実行してフィルタの動作が実行されているか確認してください

最後に

web.xmlでアプリ的にフィルタを使うように定義していてもMockMvcでテストした際に有効にならないことに気が付き今回の対応を実施しました
web.xmlで定義していればテストでも通るようにしていいと思うんだけど、こうなっているのは MockMvc が Servlet の世界とは別世界のクラスだからなのだろうか
それとも親切心からなのだろうか

0 件のコメント:

コメントを投稿