WicketTesterを使ってみた

wicket-jaのメーリングリストでWicketTesterの質問が出て、初めて存在を知りました。
id:t_yanoさんのメーリングリスト内での説明によりますと、

位置づけとしてはJUnitで行うユニットテストですね。WicketTesterは本来はアプリケーション
サーバが提供するはずのリクエストやレスポンスなどのオブジェクトのモック(模型)を使用して、
APサーバにディプロイしないままWicketアプリケーションのテストを行うことができるように
するものです。

とのことで、Validatorのテストをどうしようかと思っていたので、試してみることにしました。
バージョンは、Wicketは1.3.3でJUnitは4.4です。

ソースコード

LoginTest.java

package test;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Test;
import org.junit.Before;

/**
 * HomePageとIndexPageとMyApplicationは自分で作ったクラス
 */
public class LoginTest {
	private static WicketTester tester;
	@Before
	public void setup(){
		tester = new WicketTester(new MyApplication());
	}
	@Test
	public void ログイン() throws Exception {
		tester.startPage(new IndexPage());//ページの読み込み
		tester.assertRenderedPage(IndexPage.class);//表示されているページがIndexPageか調べる
		tester.setParameterForNextRequest("login_form:user", "ユーザ");//ユーザ名入力
		tester.setParameterForNextRequest("login_form:password", "パスワード");//パスワード入力
		tester.submitForm("login_form");//サブミットする
		tester.assertNoErrorMessage();//エラーメッセージがないか
		tester.assertRenderedPage(HomePage.class);//遷移後のページが表示されているか
	}
}

PanelやFormやTextInputなどのコンポーネントをaddしたものを指定するには、panel:form:userのように順にIDを:でくっつけて指定します。

終わりに

後ろでモックを作る必要があるので、テストの起動に少し時間がかかります。
JUnitで一律にテストできるのは便利なのですが、TDDしようと思うとテストの実行に時間がかかるとサクサク感が出なくなりそうな気がします。


ちなみに、フォームへの値のセットは、

FormTester form = tester.newFormTester("login_form");
form.setValue("user", "ユーザ");
form.setValue("password", "パスワード");
form.submit();

のように実行できます。
また、フォームからの値の取得は、

String value = form.getTextComponentValue("user");

のように行います。