拡張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);
}