Testing Spring XmlWebApplicationContext Mappings

07 Jan 2007 17:52 - (0) comments

With XmlWebApplicationContext, file paths get resolved beneath the root of the web application. Even if a given path starts with a slash, it will get interpreted as relative to the web application root directory.

This can be problematic if you have a servlet.xml in a different module. For example if you need to include PROJECT/web/WEB-INF/my-servlet.xml you could add it to the classpath. But that's not possible if you exclude the "PROJECT/web" directory from the module you're testing.

FileSystemApplicationContext works differently. It adds paths relative to the project directory.

Here's what ended up working for me:

public MyTestCase() {
ctx = new XmlWebApplicationContext(){
/**
* Add the ability to read relative FileSystemPaths
* @see org.springframework.web.context.support.XmlWebApplicationContext#getResourceByPath
*/
protected Resource getResourceByPath(String path) {
if(path.startsWith("classpath:")) return super.getResourceByPath(path);
//Copied from @see org.springframework.web.context.support.FileSystemApplicationContext#getResourceByPath
if (path != null && path.startsWith("/")) {
path = path.substring(1);
}
return new FileSystemResource(path);
}
};
ctx.setConfigLocations(new String[]{"classpath:applicationContext.xml", "/web/WEB-INF/my-servlet.xml"});
ctx.setServletContext(new MockServletContext("/"));
ctx.refresh();
handlerMapping = (HandlerMapping) ctx.getBean("urlMapping");
}

void assertCorrectController(String path, String controller) throws Exception {
HandlerExecutionChain hec = handlerMapping.getHandler(new MockHttpServletRequest("GET", path));
assertTrue(hec != null);
assertEquals(hec.getHandler(), ctx.getBean(controller));
}

Now I can do the following test:

public void testSeasonControllerMapping() throws Exception {
assertCorrectController("/my/season", "seasonController");
}

Comments

No comments allowed.

Admin