Java 如何在WicketTester中测试AjaxFormChoiceComponentUpdating行为

Java 如何在WicketTester中测试AjaxFormChoiceComponentUpdating行为,java,wicket,wicket-tester,Java,Wicket,Wicket Tester,在我的Wicket应用程序中,我使用了一个带有“是”和“否”选项的单选按钮。如果我选择“否”,我将显示一个下拉选项。我使用AjaxFormChoiceComponentUpdatingBehavior编写代码。如何使用WicketTester对其进行单元测试?如果单选按钮位于表单上,我认为您应该使用FormTester类: 有关Ajax表单提交测试的示例,您可以查看: 试试这样的方法: tester.executeAjaxEvent(“形式:myRadioButtonId”、“onchange

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

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

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

试试这样的方法:
tester.executeAjaxEvent(“形式:myRadioButtonId”、“onchange”);

至少在Wicket 1.4(我还没有尝试过1.5)中,这有点痛苦

通过网络搜索,我在中找到了提示。基本上,您不能使用
BaseWicketTester.executeAjaxEvent((String componentPath,String event)
方法,因为您使用的行为不是
AjaxEventBehavior
,也不能使用
BaseWicketTester.ExecuteBhavior(最终抽象AjaxBehavior行为)
,因为它清除了请求参数

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

我在WicketTester的扩展中实现了我自己的
executeAjaxBehavior
,但假设(在我的例子中也是如此)请求参数是组件路径的最后一个“:”分离部分:

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);
}
他的解决方案和我的(基于他的)解决方案都假设行为是组件上的第一个(或唯一一个)

这有点笨重,但像这样的东西可能适合你

如果分别获取ID和行为并将其作为参数传递可能会更好,当然,您最好找到第一个实际上是
AjaxFormChoiceComponentUpdatingBehavior的行为,而不是愉快地假设它是第一个行为,但这是一个开始


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

Wicket 1.5.x的解决方案:

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

首先选择所需的单选按钮

form.select("path to radio button", 0/1)
然后执行ajax行为:

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

这是我的一段代码,它非常适合我使用选择框,但如果您更改行为类,它也应该适用于单选按钮。所需步骤包括:

  • 在表单中插入新值(使用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);

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

好的本能,但不幸的是,AjaxFormChoiceComponentUpdatingBehavior不会是Ajax事件。在WIKET 6中成功地尝试了这一点。