事实证明这有点痛苦,至少在Wicket 1.4中是这样(我还没有尝试过1.5)。
通过网络搜索,我在Mischa Dasberg的博客。基本上,你不能使用BaseWicketTester.executeAjaxEvent((String componentPath,String event)
方法,因为你使用的行为不是AjaxEventBehavior
,你也不能使用BaseWicketTester.executeBehavior(最终的AbstractAjaxBehavior行为)
,因为它会删除请求参数。
Mischa的解决方案是在父测试用例中实现他自己的executeBehavior
方法,这适用于他的情况,但不适合我的需要,因为它假设请求参数id与完整组件路径相同。
我也做了类似的事情,在WicketTester
的扩展中实现了我自己的executejaxBehavior
,但假设(在我的情况下也是如此)请求参数是组件路径的最后一个“:”分隔部分:
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
类中的代码,可能值得仔细研究。