package org.appfuse.webapp.action; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.shale.test.mock.MockApplication; import org.apache.shale.test.mock.MockExternalContext; import org.apache.shale.test.mock.MockFacesContext; import org.apache.shale.test.mock.MockFacesContextFactory; import org.apache.shale.test.mock.MockHttpServletRequest; import org.apache.shale.test.mock.MockHttpServletResponse; import org.apache.shale.test.mock.MockHttpSession; import org.apache.shale.test.mock.MockLifecycle; import org.apache.shale.test.mock.MockLifecycleFactory; import org.apache.shale.test.mock.MockRenderKit; import org.apache.shale.test.mock.MockServletConfig; import org.apache.shale.test.mock.MockServletContext; import org.appfuse.Constants; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests; import javax.faces.FactoryFinder; import javax.faces.application.ApplicationFactory; import javax.faces.component.UIViewRoot; import javax.faces.lifecycle.LifecycleFactory; import javax.faces.render.RenderKitFactory; import java.net.URL; import java.net.URLClassLoader; import java.util.Locale; import java.util.List; import java.util.ArrayList; /** *
Abstract JUnit test case base class, which sets up the JavaServer Faces
* mock object environment for a particular simulated request. The following
* protected variables are initialized in the setUp() method, and
* cleaned up in the tearDown() method:
application (MockApplication)config (MockServletConfig)externalContext (MockExternalContext)facesContext (MockFacesContext)lifecycle (MockLifecycle)request (MockHttpServletRequestresponse (MockHttpServletResponse)servletContext (MockServletContext)session (MockHttpSession)In addition, appropriate factory classes will have been registered with
* javax.faces.FactoryFinder for Application and
* RenderKit instances. The created FacesContext
* instance will also have been registered in the apppriate thread local
* variable, to simulate what a servlet container would do.
WARNING - If you choose to subclass this class, be sure
* your onSetUp() and onTearDown() methods call
* super.setUp() and super.tearDown() respectively,
* and that you implement your own suite() method that exposes
* the test methods for your test case.
NOTE: This class is a copy of Shale's AbstractJsfTestCase, * except it extends Spring's AbstractTransactionalDataSourceSpringContextTests * instead of JUnit's TestCase.
*/ public abstract class BasePageTestCase extends AbstractTransactionalDataSourceSpringContextTests { protected final Log log = LogFactory.getLog(getClass()); protected static final String MESSAGES = Constants.BUNDLE_KEY; protected MockApplication application = null; protected MockServletConfig config = null; protected MockExternalContext externalContext = null; protected MockFacesContext facesContext = null; protected MockFacesContextFactory facesContextFactory = null; protected MockLifecycle lifecycle = null; protected MockLifecycleFactory lifecycleFactory = null; protected MockRenderKit renderKit = null; protected MockHttpServletRequest request = null; protected MockHttpServletResponse response = null; protected MockServletContext servletContext = null; protected MockHttpSession session = null; // Thread context class loader saved and restored after each test private ClassLoader threadContextClassLoader = null; /** *Set up instance variables required by this test case.
*/ @Override protected void onSetUp() throws Exception { // Set up a new thread context class loader threadContextClassLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(new URLClassLoader(new URL[0], this.getClass().getClassLoader())); // Set up Servlet API Objects servletContext = new MockServletContext(); config = new MockServletConfig(servletContext); session = new MockHttpSession(); session.setServletContext(servletContext); request = new MockHttpServletRequest(session); request.setServletContext(servletContext); request.setLocale(new Locale("en")); response = new MockHttpServletResponse(); // Set up JSF API Objects FactoryFinder.releaseFactories(); FactoryFinder.setFactory(FactoryFinder.APPLICATION_FACTORY, "org.apache.shale.test.mock.MockApplicationFactory"); FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY, "org.apache.shale.test.mock.MockFacesContextFactory"); FactoryFinder.setFactory(FactoryFinder.LIFECYCLE_FACTORY, "org.apache.shale.test.mock.MockLifecycleFactory"); FactoryFinder.setFactory(FactoryFinder.RENDER_KIT_FACTORY, "org.apache.shale.test.mock.MockRenderKitFactory"); externalContext = new MockExternalContext(servletContext, request, response); lifecycleFactory = (MockLifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); lifecycle = (MockLifecycle) lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); facesContextFactory = (MockFacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); facesContext = (MockFacesContext) facesContextFactory.getFacesContext(servletContext, request, response, lifecycle); externalContext = (MockExternalContext) facesContext.getExternalContext(); UIViewRoot root = new UIViewRoot(); root.setViewId("/viewId"); root.setRenderKitId(RenderKitFactory.HTML_BASIC_RENDER_KIT); facesContext.setViewRoot(root); ApplicationFactory applicationFactory = (ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY); application = (MockApplication) applicationFactory.getApplication(); facesContext.setApplication(application); RenderKitFactory renderKitFactory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY); renderKit = new MockRenderKit(); renderKitFactory.addRenderKit(RenderKitFactory.HTML_BASIC_RENDER_KIT, renderKit); application.setMessageBundle(Constants.BUNDLE_KEY); // set supported locales ListTear down instance variables required by this test case.
*/ @Override protected void onTearDown() throws Exception { application = null; config = null; externalContext = null; facesContext.release(); facesContext = null; lifecycle = null; lifecycleFactory = null; renderKit = null; request = null; response = null; servletContext = null; session = null; FactoryFinder.releaseFactories(); Thread.currentThread().setContextClassLoader(threadContextClassLoader); threadContextClassLoader = null; } protected String[] getConfigLocations() { return new String[] { "classpath*:/applicationContext-resources.xml", "classpath*:/applicationContext-dao.xml", "classpath*:/applicationContext-service.xml", "classpath*:/applicationContext.xml", // for modular archetypes "/WEB-INF/applicationContext*.xml"}; } }