Using Session/Request-Scoped SpringBeans in TestNG
Today i will show you how to use spring-beans (especially session-scoped respectively request-scoped) in Unittests.
First of all … its easy to use a singleton bean (no scope) in a unit-test, load the ClassPathXmlApplicationContext with configLocations, use getBean(„name“) and then use the returned objects.
But if you want use a enhanced (J2EE) spring-configuration in your unit-test you have to use the XmlWebApplicationContext.
Lets use a simple example! Imagine you have different context-files, e.g. spring-beans-application.xml:
<bean id="Foobar1" class="de.ahoehma.test.Foobar" scope="request"/> <bean id="Foobar2" class="de.ahoehma.test.Foobar" scope="session"/> <bean id="Foobar3" class="de.ahoehma.test.Foobar" />
Then you have your unit-test:
public class SpringBeansTestNg { // // XXX we have to define all spring-context-files - later this could be done via test-ng-provider or // via spring with "spring-beans-*.xml" (i try it but it doesnt work) // private final String[] contextLocations = new String[]{ "spring-beans-application.xml", "spring-beans-services.xml", "spring-beans-persistence.xml", "spring-beans-security.xml",}; private ApplicationContext applicationContext; @BeforeTest private void loadApplicationContext() { final XmlWebApplicationContext xmlApplicationContext = new XmlWebApplicationContext(); xmlApplicationContext.setConfigLocations(contextLocations); final MockServletContext servletContext = new MockServletContext(""); xmlApplicationContext.setServletContext(servletContext); final RequestContextListener requestContextListener = new RequestContextListener(); final MockHttpServletRequest request = new MockHttpServletRequest(servletContext); final ServletRequestEvent requestEvent = new ServletRequestEvent(servletContext, request); requestContextListener.requestInitialized(requestEvent); xmlApplicationContext.refresh(); applicationContext = xmlApplicationContext; } /** * @return request scoped bean */ private Foobar getFoobar1() { return (Foobar) applicationContext.getBean("Foobar1"); //$NON-NLS-1$ } /** * @return session scoped bean */ private Foobar getFoobar2() { return (Foobar) applicationContext.getBean("Foobar2"); //$NON-NLS-1$ } /** * @return singleton bean */ private Foobar getFoobar3() { return (Foobar) applicationContext.getBean("Foobar3"); //$NON-NLS-1$ } }
The magic happend in the loadApplicationContext.
Try it 🙂
How to test spring session or request scope beans « waffel’s Weblog 13:46 am Montag, 27. April 2009 Permalink | Zum Antworten anmelden
[…] Another approach can be found in ahöhma’s weblog. […]
digitaljoel 9:04 am Dienstag, 11. Januar 2011 Permalink | Zum Antworten anmelden
Great post, even at over 2 years old. Thanks for the info.