If you're using Spring beans in your Wicket pages, change the dependency from wpt-runtime to wpt-runtime-spring in pom.xml:
<project ...>
...
<dependencies>
...
<dependency>
<groupId>com.ttdev</groupId>
<artifactId>wpt-runtime-spring</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
</project>In your application class, use an injector that will inject mocks first and if not found, try the Spring beans:
public class MyApp extends WebApplication {
@Override
protected void init() {
MockableSpringBeanInjector.installInjector(this);
}
}There is no need to change your Wicket page; you continue to use @SpringBean to inject the beans:
public class PageContainingForm extends WebPage {
@SpringBean
private MyService service;
private String input;
private String result;
public PageContainingForm() {
input = service.getDefaultInput();
Form<PageContainingForm> form = new Form<PageContainingForm>("form",
new CompoundPropertyModel<PageContainingForm>(this)) {
@Override
protected void onSubmit() {
result = service.getResult(input);
}
};
add(form);
form.add(new TextField<String>("input"));
add(new Label("result", new PropertyModel<String>(this, "result")));
}
}In the test, you provide the mock as a bean to be injected instead of passing it as a constructor argument:
@Test
public class PageContainingFormTest {
public void testSubmitForm() {
MockableSpringBeanInjector.mockBean("service", new MyService() {
public String getDefaultInput() {
return "xyz";
}
public String getResult(String input) {
return input + input;
}
});
WicketSelenium ws = WebPageTestContext.getWicketSelenium();
ws.openBookmarkablePage(PageContainingForm.class);
assert ws.getValue(By.name("input")).equals("xyz");
ws.setResponsePageMarker();
ws.click(By.xpath("//input[@type='submit']"));
ws.waitForMarkedPage();
assert ws.getText(By.id("result")).equals("xyzxyz");
}
}