拡張Wicketテスタのソース
package com.cm55.third.wicket.test; import java.io.*; import java.util.*; import junit.framework.*; import org.apache.wicket.*; import org.apache.wicket.feedback.*; import org.apache.wicket.markup.html.form.*; import org.apache.wicket.markup.html.panel.*; import org.apache.wicket.protocol.http.*; import org.apache.wicket.util.tester.*; /** * 拡張Wicketテスタ */ public class ExWicketTester { /** Wicketのテスター */ protected WicketTester wicketTester; /** 作成 */ public ExWicketTester() { wicketTester = new WicketTester(); } /** WebApplicationを指定して作成 */ public ExWicketTester(WebApplication application) { wicketTester = new WicketTester(application); } /** * Formに対するテスターを作成する * @param form フォーム * @return ExFormTester */ public <T extends Form<?>> ExFormTester<T> newFormTester(T form) { String path = form.getPageRelativePath(); if (path.length() == 0) { throw new IllegalArgumentException("指定フォームはページ上にありません"); } return new ExFormTester<T>(wicketTester.newFormTester(path)); } /** ページの描画開始 */ @SuppressWarnings("unchecked") public <C extends Page> C startPage(Class<C> pageClass) { return (C)wicketTester.startPage(pageClass); } /** ページの描画開始 */ @SuppressWarnings("unchecked") public <T extends Page> T startPage(T page) { return (T)wicketTester.startPage(page); } /** パネルの描画開始。ExTestPanelSourceを指定する */ @SuppressWarnings("unchecked") public <T extends Panel> T startPanel(final ExTestPanelSource testPanelSource) { return (T)wicketTester.startPanel(new TestPanelSource() { public Panel getTestPanel(final String panelId) { return testPanelSource.getTestPanel(panelId); } }); } /** 最後に描画したページを取得 */ @SuppressWarnings("unchecked") public <T extends Page> T getLastRenderedPage() { return (T)wicketTester.getLastRenderedPage(); } /** 何らかのエラーメッセージがある */ public void assertHasErrorMessage() { List<Serializable> messages = wicketTester.getMessages(FeedbackMessage.ERROR); Assert.assertTrue("expect some error message, but contains none.", messages.size() != 0); } //////////////////////////////////////////////////////////////////////////// // 以下は単純なWicketTesterのラッパ //////////////////////////////////////////////////////////////////////////// public void assertRenderedPage(Class<? extends Page> expectedRenderedPageClass) { wicketTester.assertRenderedPage(expectedRenderedPageClass); } public void assertErrorMessages(String[] expectedErrorMessages) { wicketTester.assertErrorMessages(expectedErrorMessages); } public void assertInvisible(String path) { wicketTester.assertInvisible(path); } public void assertNoErrorMessage() { wicketTester.assertNoErrorMessage(); } public void assertVisible(String path) { wicketTester.assertVisible(path); } public void assertLabel(String path, String expectedLabelText) { wicketTester.assertLabel(path, expectedLabelText); } public FormTester newFormTester(String path) { return wicketTester.newFormTester(path); } public void clickLink(String path) { wicketTester.clickLink(path); } }
package com.cm55.third.wicket.test; import org.apache.wicket.*; import org.apache.wicket.markup.html.form.*; import org.apache.wicket.util.tester.*; /** * 拡張フォームテスタ */ public class ExFormTester<T extends Form<?>> { /** Wicket本体のフォームテスタ */ protected FormTester formTester; /** * Wicketのフォームテスタとフォームを指定する。 * @param formTester * @param form */ @SuppressWarnings("unchecked") ExFormTester(FormTester formTester) { this.formTester = formTester; } /** フォームを取得 */ @SuppressWarnings("unchecked") public T getForm() { return (T)formTester.getForm(); } /** フォーム内コンポーネントのIDを指定して値を設定 */ public void setValue(String id, String value) { formTester.setValue(id, value); } /** フォーム内コンポーネントの値を設定 */ public void setValue(Component component, String value) { formTester.setValue(componentRelativePath(component), value); } /** フォームをサブミット */ public void submit() { formTester.submit(); } /** フォーム内コンポーネントを指定してサブミット */ public void submit(Component component) { componentRelativePath(component); formTester.submit(component.getId()); } /** * 指定されたコンポーネントについて、フォームからの相対パスを取得 * @param component コンポーネント * @return フォームからの相対パス、コロン区切り */ private String componentRelativePath(Component component) { // フォームのページからの相対パスとコンポーネントのページからの相対パスを取得し // その差分がコンポーネントのフォームからの相対パスとなる。 String formPath = getForm().getPageRelativePath(); String componentPath = component.getPageRelativePath(); if (!componentPath.startsWith(formPath)) { throw new IllegalArgumentException("指定コンポーネントはフォーム上にありません"); } String path = componentPath.substring(formPath.length() + 1); return path; } }
package com.cm55.third.wicket.test; import org.apache.wicket.*; import org.apache.wicket.markup.html.panel.*; /** * テスト対象パネルの取得用インターフェース * @param <T> パネルのタイプ */ public interface ExTestPanelSource<T extends Panel> extends IClusterable { public T getTestPanel(final String panelId); }