2008年6月9日月曜日

ServletTesterとSpringFramework

jettyにServletTesterなるものがあるのに気がついた。
見てみると、Mockより現実的だし、Cactusよりも面倒くさくなさそう。

しかし、springのWebApplicationContextの取得に悪戦苦闘…

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener>

の部分は
addEventListenerメソッドですぐわかったのだけど、

<context-param>
<param-name>contextConfigLocation
<param-value>/WEB-INF/applicationContext.xml
</context-param>

どうもcontext-paramの設定がわからない。
setAttributeメソッドがあるけど、これはServletのInitParameterのようだし。

結局setResourceBaseを利用すればWebApplicationContextが取得出来ることがようやくわかった!
ソースはこんな感じ

private static ServletTester tester;
private static String baseUrl;

@Before
public void before() throws Exception {
tester = new ServletTester();
tester.setContextPath("/");
tester.addServlet(TestServlet.class, "/servlet");
// この方法はでは設定ファイルは見つからないよ
//tester.setAttribute("contextConfigLocation", "applicationContext.xml");
tester.addEventListener(new ContextLoaderListener());
// こっちの方法なら見つけられる
tester.setResourceBase("src/test/resources");
baseUrl = tester.createSocketConnector(true);
tester.start();
}

mavenな私のディレクトリ構造は

${project.home}
`- src/
|- main/
| |- java/
| `- resources/
|
|- test/
|- java/
`- resources/
`-WEB-INF/
`- applicationContext.xml

結局setResourceBaseはServlt環境から取得できるgetRealPath()にあたるのかな。
springではWebApplicationContext作成時に"WEB-INF/applicationContext.xm"が
定義されているのでうまいこと帳尻合わせた感じ。
なのでテストケースに合わせて設定ファイルの変更できず…ガックシ。

0 件のコメント: