如何在WicketTester中测试AjaxFormChoiceComponentUpdatingBehavior

时间:2011-05-30 13:01:54

标签: java wicket wicket-tester

在我的Wicket应用程序中,我使用了一个带有“是”和“否”选项的单选按钮。如果我选择“否”,我应该显示一个下拉选项。我使用AjaxFormChoiceComponentUpdatingBehavior编写了代码。如何使用WicketTester进行单元测试?

6 个答案:

答案 0 :(得分:4)

Wicket 1.5.x的解决方案:

 AbstractAjaxBehavior behavior = (AbstractAjaxBehavior)WicketTesterHelper.
          findBehavior(getTester().getComponentFromLastRenderedPage("path:to:component"),
                        AjaxFormChoiceComponentUpdatingBehavior.class);
 getTester().executeBehavior(behavior);

答案 1 :(得分:2)

首先选择您想要的单选按钮。

form.select("path to radio button", 0/1)

然后执行ajax行为:

tester.executeBehavior((AbstractAjaxBehavior)tester.getComponentFromLastRenderedPage("path to radio buttons").getBehaviors().get(0));

答案 2 :(得分:1)

这是我的代码片段,对于我来说非常适合选择框,但如果更改了行为类,则应该也可以使用单选按钮。需要的步骤是:

  • 将新值插入表单(使用FormTester)
  • 查找行为
  • 执行更改时的行为

以下是代码示例:

//simulate insert new value
FormTester formTester = tester.newFormTester(PANEL_ID + FORM); 
formTester.setValue("selectBox", "newValue");
//Find onchange behaviour
AjaxFormComponentUpdatingBehavior behavior = 
       (AjaxFormComponentUpdatingBehavior) WicketTesterHelper.findBehavior(
       tester.getComponentFromLastRenderedPage(PANEL_ID + FORM + ":" + "selectBox"), 
       ajaxFormComponentUpdatingBehavior.class);
//execute onchange
tester.executeBehavior(behavior);

我错过了如何更新之前答案中的表单值。

答案 3 :(得分:0)

如果单选按钮位于表单上,我认为您应该使用FormTester类:

http://wicket.apache.org/apidocs/1.4/org/apache/wicket/util/tester/FormTester.html

有关Ajax表单提交测试的示例,您可以查看:

http://www.java2s.com/Open-Source/Java-Document/J2EE/wicket-1.4/org/apache/wicket/ajax/form/AjaxFormSubmitTest.java.htm

答案 4 :(得分:0)

尝试这样的事情: tester.executeAjaxEvent("form:myRadioButtonId", "onchange");

答案 5 :(得分:0)

事实证明这有点痛苦,至少在Wicket 1.4中(我没有试过1.5)。

通过网络搜索,我在Mischa Dasberg's blog中找到了提示。基本上,您无法使用BaseWicketTester.executeAjaxEvent((String componentPath, String event)方法,因为您使用的行为不是AjaxEventBehavior而您无法使用BaseWicketTester.executeBehavior(final AbstractAjaxBehavior behavior),因为它会清除请求参数。

Mischa的解决方案是在父测试用例中实现自己的executeBehavior方法,该方法适用于他的情况,但不适合我的需要,因为它假设请求参数id与完整组件路径相同。

我通过在executeAjaxBehavior的扩展中实现我自己的WicketTester来做类似的事情,但假设(在我的情况下是这样),请求参数是最后一个“:”分隔部分组件路径:

public void executeAjaxBehavior(String path, String value) {
    AbstractAjaxBehavior behavior = (AbstractAjaxBehavior) getComponentFromLastRenderedPage(path).getBehaviors().get(0);
    CharSequence url = behavior.getCallbackUrl(false);
    WebRequestCycle cycle = setupRequestAndResponse(true);
    getServletRequest().setRequestToRedirectString(url.toString());
    String[] ids = path.split(":");
    String id = ids[ids.length-1];
    getServletRequest().setParameter(id, value);
    processRequestCycle(cycle);
}

他的解决方案和我的解决方案(基于他的)也假设行为是组件上的第一个(或唯一的)行为。

这有点笨拙,但这样的事情对你有用。

如果ids和行为分别得到并作为参数传递可能会更好,当然你可能会找到第一个实际上是AjaxFormChoiceComponentUpdatingBehavior的行为,而不是轻率地假设这是第一个行为,但这是一个开始。

这也是BaseWicketTester类中其他行为测试方法的类似代码,可能值得一看。