Wicket and Spring JUnit Test

Just had a hard time to create a Junit Test with Wicket, Spring and Mockito. Finally I succeeded and want to share the solution.

The usecase is simple: a test if rendering of the homepage succeeds. The tricky part was the instantiation of the real Wicket Webapplication ( not a MockWebapplication ) with the Spring Context. Without any special arrangements instantiation of the Webapplication led to the following stacktrace:

java.lang.IllegalStateException: 
No WebApplicationContext found: no ContextLoaderListener registered? 
at org.springframework.web.context.support.WebApplicationContextUtils.
getRequiredWebApplicationContext(WebApplicationContextUtils.java:90)

To bypass this I override the method getServletContext in the WicketApplication and give Spring what it needs. This way i can test Wicket pages with Spring and using mocks with Mockito.

@RunWith(MockitoJUnitRunner.class)
public class TestHomePage
{
	private WicketTester tester;


	private YourWicketApplication app;

	@Mock
	private Service aService;

	@Before
	public void setUp() throws IOException, Exception
	{
		MockitoAnnotations.initMocks(this);
		tester = new WicketTester(app = new YourWicketApplication(){
                        
      /**
			 * adjust the servletcontext to contain a WebApplicationContext
			 */
			@Override
			public ServletContext getServletContext() {
				ServletContext servletContext = super.getServletContext();
				XmlWebApplicationContext  applicationContext = new XmlWebApplicationContext();
				applicationContext.setConfigLocation("classpath:applicationContext.xml");
				applicationContext.setServletContext(servletContext);
				applicationContext.refresh();
				servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext);

				return servletContext;
			}

		});

    // replace spring bean with a mock
		app.setService(aService);

		Serializer serializer = new Persister();
		ListOfStuff list = serializer.read(ListOfStuff.class, new ClassPathResource("listofstuff.xml").
                getInputStream());

		when(aService.getList()).thenReturn(list);
	}

	@Test
	public void homepageRendersSuccessfully()
	{
		//start and render the test page
		tester.startPage(HomePage.class);

		//assert rendered page class
		tester.assertRenderedPage(HomePage.class);
		verify(aService).getList();
	}
}