Wicket Tester

Wicket勉強会の懇親会で、ちょっと話題になったWicketTesterについてまとめ。
WicketのTestFrameworkがWicketTester。
パッケージでいうとorg.apache.wicket.util.testerあたりに色々入っている。

環境
Wicket 1.4-m3
JUnit 4.4

基本的な使い方

例えば以下のようなWebPageクラスがあったする.

HomePage.java
public class HomePage extends WebPage {
	public HomePage() {
		add(new Label("message", "If you see this message wicket is properly configured and running"));
	}
}

これのテストケースはこんな感じになる.

TestHomePage.java
public class TestHomePage{
	private WicketTester tester;
	@Before
	public void before() {
		tester = new WicketTester(new WicketApplication());
	}
	@Test
	public void testRenderHomePage() {
		// HomePageをレンダリング
		tester.startPage(HomePage.class);
		// HomePageがレンダリングされているか確認
		tester.assertRenderedPage(HomePage.class);
		// messageという名前のLabelコンポーネントのメッセージを確認
		tester.assertLabel("message","If you see this message wicket is properly configured and running");
	}
}

Formのテスト基本

まずシンプルなFormテスト。Formのページがあったとする。

FormPage.java
public class FormPage extends WebPage {
	private String text;
	private String password;
	public FormPage() {
		Form form = new Form("form", new CompoundPropertyModel(this)) {
			@Override
			protected void onSubmit() {
				setResponsePage(new NextPage(text, password));
			}
		};
		add(form);

		form.add(new TextField("text"));
		form.add(new PasswordTextField("password"));
	}
}
NextPage.java
public class NextPage extends WebPage {
	public NextPage(String text, String password) {
		super();
		add(new Label("text", text));
		add(new Label("password", password));
	}
}

テストケースはこんな感じ

TestFormPage.java
public class TestFormPage {
	private WicketTester tester;
	@Before
	public void before() {
		tester = new WicketTester(new WicketApplication());
	}
	@Test
	public void testFormPage() {
		tester.startPage(FormPage.class);
		tester.assertRenderedPage(FormPage.class);
		// FormTesterを生成
		FormTester formTester = tester.newFormTester("form");
		// "text"に値を設定
		formTester.setValue("text", "テストテキスト");
		// "password"に値を設定
		formTester.setValue("password", "テストパスワード");
		// submitを実行
		formTester.submit();
		tester.assertRenderedPage(NextPage.class);
		tester.assertLabel("text", "テストテキスト");
		tester.assertLabel("password", "テストパスワード");
	}
}

上記のようにFormTesterを利用するとFormのテストが簡単に実施できる。

Formのテスト - バリデーションのテストとか

Formのバリデーションチェックを行うときに使えます。

FormPage.java
public class FormPage extends WebPage {

	private String text;

	public FormPage() {
		add(new FeedbackPanel("feedback"));
		Form form = new Form("form", new CompoundPropertyModel(this)) {
			@Override
			protected void onSubmit() {
				setResponsePage(NextPage.class);
			}
		};
		add(form);
		final TextField textField = new TextField("text");
		textField.setRequired(true);
		textField.add(new PatternValidator("^[0-9]{4}$"));
		form.add(textField);
	}
}
NextPage.java
public class NextPage extends WebPage {}
TextFormPage.java
public class TestFormPage {
	private WicketTester tester;
	@Before
	public void before() {
		tester = new WicketTester(new WicketApplication());
	}
	@Test
	public void testFormPage() {
		tester.startPage(FormPage.class);
		tester.assertRenderedPage(FormPage.class);
		FormTester formTester = tester.newFormTester("form");
		formTester.setValue("text", "0000");
		formTester.submit();
		tester.assertRenderedPage(NextPage.class);
	}
	@Test
	public void testFormTextRequire() {
		tester.startPage(FormPage.class);
		FormTester formTester = tester.newFormTester("form");
		formTester.submit();
		tester.assertErrorMessages(new String[] { "'text' 欄 は必須です。" });
	}
	@Test
	public void testFormTextPatternValidator() {
		tester.startPage(FormPage.class);
		FormTester formTester = tester.newFormTester("form");
		formTester.setValue("text", "00000");
		formTester.submit();
		tester.assertErrorMessages(new String[] { "'00000' はパターン '^[0-9]{4}$' にマッチしません。" });
	}
}

assertErrorMessagesを使えばバリデーションテストができます。引数に与えるのは、Stringの配列ですので、コンポーネントが複数あって複数のエラーメッセージが同時に出力される場合は

tester.assertErrorMessages(new String[] { "Message1", "Message2", "Message3" });

このように複数のメッセージを格納してあげればOKです。

徐々に書く