001    /*
002     * Copyright 2002-2005 the original author or authors.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.richclient.test;
017    
018    import junit.framework.TestCase;
019    
020    import org.apache.commons.logging.Log;
021    import org.apache.commons.logging.LogFactory;
022    import org.springframework.context.ConfigurableApplicationContext;
023    import org.springframework.context.support.StaticApplicationContext;
024    import org.springframework.context.support.StaticMessageSource;
025    import org.springframework.richclient.application.Application;
026    import org.springframework.richclient.application.ApplicationServicesLocator;
027    import org.springframework.richclient.application.config.ApplicationLifecycleAdvisor;
028    import org.springframework.richclient.application.config.DefaultApplicationLifecycleAdvisor;
029    import org.springframework.richclient.application.support.DefaultApplicationServices;
030    
031    /**
032     * Convenient base implementation for Spring Rich test cases; automatically configures the
033     * application services singleton and provides hooks for common test case setup
034     * requirements.
035     * 
036     * @author Oliver Hutchison
037     */
038    public abstract class SpringRichTestCase extends TestCase {
039    
040        /**
041         * Logger available to subclasses.
042         */
043        protected final Log logger = LogFactory.getLog(getClass());
044    
045        protected DefaultApplicationServices applicationServices;
046    
047        protected final void setUp() throws Exception {
048            try {
049                Application.load(null);
050                ConfigurableApplicationContext applicationContext = createApplicationContext();
051                applicationServices = new DefaultApplicationServices(applicationContext);
052                new ApplicationServicesLocator(applicationServices);
053    
054                final ApplicationLifecycleAdvisor advisor = createApplicationLifecycleAdvisor();
055                final Application application = new Application(advisor);
056                advisor.setApplication(application);
057                
058                Application.instance().setApplicationContext(applicationContext);
059                applicationServices.setApplicationContext(applicationContext);
060    
061                registerBasicServices(applicationServices);
062                registerAdditionalServices(applicationServices);
063    
064                applicationContext.refresh();
065                doSetUp();
066            } catch( Exception e ) {
067                Application.load(null);
068                throw e;
069            }
070        }
071    
072            /**
073         * returns the application context to use for testing
074         * 
075         * overwrite to specify a different application context
076         * 
077         * @return this implementation returns an instance of StaticApplicationContext
078         */
079        protected ConfigurableApplicationContext createApplicationContext() {
080            return new StaticApplicationContext();
081        }
082    
083        /**
084         * Subclasses may override this to return a custom
085         * ApplicationLifecycleAdvisor.
086         */
087        protected ApplicationLifecycleAdvisor createApplicationLifecycleAdvisor() {
088            return new DefaultApplicationLifecycleAdvisor();
089        }
090        
091        
092    
093        /**
094         * Register the application services needed for our tests.
095         */
096        protected void registerBasicServices( DefaultApplicationServices applicationServices ) {
097            applicationServices.setMessageSource(new StaticMessageSource());
098        }
099    
100        /**
101         * May be implemented in subclasses that need to register services with the global
102         * application services instance.
103         */
104        protected void registerAdditionalServices( DefaultApplicationServices applicationServices ) {
105        }
106    
107        /**
108         * Get the application services instance.
109         */
110        protected DefaultApplicationServices getApplicationServices() {
111            return applicationServices;
112        }
113    
114        /**
115         * Tear down method invoked by JUnit framework. Derived classes should put their work
116         * in {@link #doTearDown()}.
117         */
118        protected final void tearDown() throws Exception {
119            try {
120                doTearDown();
121            } finally {
122                Application.load(null);
123            }
124        }
125    
126        /**
127         * Should be implemented in subclasses as an alternative to the final method
128         * {@link #setUp()}
129         * 
130         * @throws Exception
131         */
132        protected void doSetUp() throws Exception {
133        }
134    
135        /**
136         * Should be implemented in subclasses as an alternative to the final method
137         * {@link #tearDown()}
138         */
139        protected void doTearDown() throws Exception {
140        }
141    }