单元测试Wicket输入组件

时间:2014-04-17 15:32:36

标签: wicket wicket-tester

我刚刚编写了我的第一个Wicket组件:)它包含一个带有ListView个输入字段的Radio。现在我想进行单元测试,如果选定的值进入模型。

由于WicketTester.newFormTester("myForm")需要表单,我会尝试动态创建表单:

public void testDataBinding()
{
    Model model = ...
    MyRadioComponent myRadioComponent = new MyRadioComponent (...);
    Form form = new Form("myForm", ...);
    form.add(myRadioComponent);
    WicketTester wicketTester = new WicketTester();
    wicketTester.startComponentInPage(form);
    // FormTester formTester = wicketTester.newFormTester("myForm");
    // ...
}

现在wicketTester.startComponentInPage(form)会产生:

Failed: Component [myForm] (path = [0:x]) must be applied to a tag of type [form], 
        not: '<span wicket:id="myForm" id="myForm3">'

知道如何解决这个问题和/或如何以正确的方式测试这样的输入组件?

2 个答案:

答案 0 :(得分:3)

我相信startComponentInPage使用<span>作为其组件。 Wicket会检查Form标记是否附加到<form>标记,这就是您收到此错误的原因。

您需要创建自己的测试页面,其中包含<form>。有关内联标记的示例,请参阅org.apache.wicket.markup.html.form.NumberTextFieldTest。否则,使用关联的html标记文件创建一个Form测试页面类。

答案 1 :(得分:3)

好的,详细解决方案现在看起来像这样:

public FormTester createFormTester(Component c) {
    final WicketTester wicketTester = new WicketTester();
    final FormPage page = new FormPage(c);
    wicketTester.startPage(page);
    return wicketTester.newFormTester(page.getPathToForm());
}

private static class FormPage extends WebPage implements IMarkupResourceStreamProvider {

    private final Form<Void> form;
    private final Component c;

    private FormPage(final Component c) {
        this.c = c;
        add(form = new Form<>("form"));
        form.add(c);
    }

    public String getPathToForm() {
        return form.getPageRelativePath();
    }

    @Override
    public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) {
        return new StringResourceStream(
                "<html><body>"
                + "<form wicket:id='" + form.getId() + "'><span wicket:id='" + c.getId() + "'/></form>"
                + "</body></html>");
    }
}