For example, the page below contains an AJAX link that will update the current number in the page (this example page uses a Spring bean, but it works the same way with a plain Java interface):
<html>
<body>
<a wicket:id="calcNext">Calculate next</a>
<span id="output">Current: <span wicket:id="current">0</span></span>.
</body>
</html>
public interface CalcService {
int calcNext(int current);
}
public class AjaxPage extends WebPage {
@SpringBean
private CalcService service;
private int current = 0;
private Label currentLabel;
public AjaxPage() {
AjaxLink<Void> calcNext = new AjaxLink<Void>("calcNext") {
@Override
public void onClick(AjaxRequestTarget target) {
current = service.calcNext(current);
target.add(currentLabel);
}
};
add(calcNext);
currentLabel = new Label("current", new PropertyModel<Integer>(this,
"current"));
add(currentLabel);
currentLabel.setOutputMarkupId(true);
}
}To test it, as usual, you will mock the service. Here, you just increment the number. To test the AJAX effect, you first install a listener for the AJAX completion (only need to do it once per page) and then wait until it happens and then check the result:
@Test
public class AjaxPageTest {
public void testEasyWaitingForAjax() {
MockableSpringBeanInjector.mockBean("service", new CalcService() {
public int calcNext(int current) {
return current + 1;
}
});
WicketSelenium ws = WebPageTestContext.getWicketSelenium();
ws.openBookmarkablePage(AjaxPage.class);
ws.subscribeAjaxDoneHandler(); // install the AJAX completion listener
WebElement output = ws.findElement(By.id("output"));
assert output.getText().equals("Current: 0");
ws.findElement(By.linkText("Calculate next")).click(); // ajax call
ws.waitUntilAjaxDone(); // wait for the completion
assert output.getText().equals("Current: 1");
ws.findElement(By.linkText("Calculate next")).click(); // ajax call
ws.waitUntilAjaxDone(); // wait for the completion
assert output.getText().equals("Current: 2");
}
}