我有创建输入字段的面板,并且在创建表单的另一个面板中包含在表单中。我的问题是我看不到如何对我的面板进行单元测试。
假设我有这个java:
public class MyPanel extends Panel {
public MyPanel(String id, IModel model) {
super(id, model);
TextField<String> test = new TextField<String>("test");
test.add(new StringValidator.MaximumLengthValidator(5));
add(test);
}
}
和html:
<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns:wicket>
<head></head>
<body>
<wicket:panel>
<p>
<label wicket:for="test"> <wicket:message key="test" />
</label> <input type="text" wicket:id="test" />
</p>
</wicket:panel>
</body>
</html>
有没有办法进行单元测试,可以测试我的MaximumLengthValidator? 由于面板不包含表单,我不能直接使用FormTester,WicketTester似乎没有使用Validator。
答案 0 :(得分:0)
在这种情况下,最好覆盖类FormComponentPanel
,它是泛型类型FormComponent<T>
的子类。这意味着您可以将新组件视为例如TextField<String>
的实例。
public class MyPanel extends FormComponentPanel<String>
根据我的经验,最好在包含FormTester
的{{1}}上测试表单组件。除非提交表单,否则您无法获得转换后的输入。
如果能够在没有表单提交的情况下进行测试,您可以做的是添加Form
对Javascript'onupdate'函数做出反应的行为,但是您必须从Javascript读取输入并转换它自己。
因此,我的adivce:
AjaxFormComponentUpdatingBehavior
FormComponentPanel
测试您的验证工具
答案 1 :(得分:0)
我遇到了同样的问题,但在这里或其他任何地方找不到令人满意的答案。这个问题是在四年前提出来的,但是我找到了一个解决方案,并且会分享它,即使那个问过很久以前的人,也可能会帮助别人。 我更喜欢使用小组件并测试它们,并且表单可能很大且很复杂,如果表单在一个文件中,它将反映在测试中。但是如何测试?
诀窍是让你的组件放入表格中。
我制作了一个只能用于测试的小组件(目前在我的src / test / java文件夹中,但是我可能会将它移动到另一个模块并依赖它导入测试范围,如果我需要更多模块中的项目)。有了这个小帮助类,我可以在应用程序运行时测试我将在表单中的不同组件,并且需要在表单内进行测试。
这是一种解决方法,但我觉得我和框架遇到了一半。
public class FormPanel extends Panel {
private final Component iNeedToBeInAForm;
public FormPanel(String id, IModel<?> model, Component iNeedToBeInAForm) {
super(id, model);
this.iNeedToBeInAForm = iNeedToBeInAForm;
}
@Override
protected void onInitialize() {
super.onInitialize();
final Form form = new Form("form", getDefaultModel());
form.add(iNeedToBeInAForm);
add(form);
}
}
和用于此的html是:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
<form wicket:id="form">
<div wicket:id="panel" id="panel">
</div>
</form>
</wicket:panel>
</body>
</html>
在测试中,我使用它:
panel = new MyPanel("panel", model);
tester.startComponentInPage(new FormPanel("id", model, panel));
final FormTester formTester = tester.newFormTester("id:form");
formTester.setValue("panel:" + MyPanel.id_BETA_BLOCKAD_DOSAGE_START_SELECT, DEFAULT.toString());
tester.executeAjaxEvent("id:form:panel:" + MyPanel.id_BETA_BLOCKAD_DOSAGE_START_SELECT, "onchange");
Result result = tester.isVisible("id:form:panel:" + MyPanel.id_BETA_BLOCKAD_DOSAGE_START_TEXT);
assertThat(result.wasFailed(), is(true));