Letzte Woche bin ich beim Testen von AjaxBehavior in Wicket auf ein Problem gestoßen.
Stellen Sie sich folgendes Szenario vor: Wir haben eine FormComponent, zu der ein AjaxBehavior hinzugefügt wurde. Wir möchten dieses Verhalten testen. Je nach ausgewähltem Wert, z.B. eines RadioChoice, soll das AjaxBehavior eine Komponente ein- und eine andere ausblenden.
public class TestPage extends WebPage {
privates Label l1;
privates Label l2;
private WebMarkupContainer container;
public TestSeite() {
container = new WebMarkupContainer("container");
container.setOutputMarkupPlaceholderTag(true);
l1 = new Label("wahr", "Ich habe wahr gewählt");
l1.setVisible(false);
l1.setOutputMarkupPlaceholderTag(true);
l2 = new Label("false", "Ich habe false gewählt");
l2.setVisible(false);
l2.setOutputMarkupPlaceholderTag(true);
container.add(new SingleLineRadioChoice("choice", new Model(),
Arrays.asList(Boolean.TRUE, Boolean.FALSE)) {
private static final long serialVersionUID = 1L;
@Override
public void onUpdateBehavior(AjaxRequestTarget target) {
if(getModelObject()) {
l1.setVisible(true);
l2.setVisible(false);
} sonst {
l1.setVisible(false);
l2.setVisible(true);
}
target.addComponent(container);
}
}, l1, l2);
add(container);
}
public class SingleLineRadioChoice extends RadioChoice {
private static final long serialVersionUID = -6650798211067977383L;
public SingleLineRadioChoice(String id, IModel model, List choices) {
super(id, model, choices);
setSuffix("");
add(new AjaxFormChoiceComponentUpdatingBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
updateModel();
onUpdateBehavior(target);
}
});
}
/** @param target Das {@link AjaxRequestTarget}. */
public void onUpdateBehavior(AjaxRequestTarget target) { }
}
}
Normalerweise sollten Sie erwarten, dass der Test wie folgt funktioniert:
public void testShouldShowL2() {
tester.assertInvisible("container:false");
tester.setParameterForNextRequest("container:choice", "true");
tester.executeBehavior((AbstractAjaxBehavior)
tester.getComponentFromLastRenderedPage("container:choice").getBehaviors().get(0));
tester.assertVisible("container:false");
}
Leider funktioniert dies nicht, da die WicketTester-Methode executeBehavior tester.getServletRequest().setRequestToRedirectString(url.toString()) aufruft, wodurch der ausgewählte Wert auf Null gesetzt wird. Um dieses Verhalten testen zu können, habe ich eine Methode in meiner BaseTest-Klasse erstellt, die wie folgt aussieht:
/**
* Wicket tester.executeBehavior ruft auf
* tester.getServletRequest().setRequestToRedirectString(url.toString()), das die
* ausgewählten Wert auf null setzen. Um den Wert zu behalten, rufen Sie tester.getServletRequest() auf.
* .setParameter(id, value) nach tester.getServletRequest().setRequestToRedirectString
*(url.toString())
* @param id Die wicket:id.
* @param value Der Wert, der ausgewählt werden soll Der Wert sollte der ausgewählte Index sein
* aus der Liste, beginnend mit 0.
*/
public void executeBehavior(String id, String value) {
AbstractAjaxBehavior behavior = (AbstractAjaxBehavior)
tester.getComponentFromLastRenderedPage(id).getBehaviors().get(0);
CharSequence url = behavior.getCallbackUrl(false);
WebRequestCycle cycle = tester.setupRequestAndResponse(true);
tester.getServletRequest().setRequestToRedirectString(url.toString());
tester.getServletRequest().setParameter(id, value);
tester.processRequestCycle(cycle);
}
Jetzt können Sie das Verhalten wie folgt testen.
public void testShouldShowL2() {
tester.assertInvisible("container:false");
executeBehavior("container:choice", "1");
tester.assertVisible("container:false");
}
Verfasst von
Mischa Dasberg
Unsere Ideen
Weitere Blogs
Contact



