Blog

Wicket AjaxBehavior testen

Mischa Dasberg

Aktualisiert Oktober 23, 2025
2 Minuten

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.Man sollte meinen, dass dieses Verhalten bei der Verwendung von WicketTester sofort einsatzbereit ist, aber leider ist das nicht der Fall. Das Auslösen eines Ajaxbehavior ist mit WicketTester einfach, aber das Setzen des ausgewählten Wertes nicht. Wir haben also den folgenden Code:

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

Contact

Let’s discuss how we can support your journey.