1 /*
2  * Copyright 2002-2005 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package org.springframework.context;
18 
19 import java.util.Locale;
20 
21 import org.springframework.beans.TestBean;
22 import org.springframework.beans.factory.AbstractListableBeanFactoryTests;
23 import org.springframework.beans.factory.BeanFactory;
24 import org.springframework.beans.factory.LifecycleBean;
25 
26 /**
27  * @author Rod Johnson
28  * @author Juergen Hoeller
29  */
30 public abstract class AbstractApplicationContextTests extends AbstractListableBeanFactoryTests {
31 
32 	/** Must be supplied as XML */
33 	public static final String TEST_NAMESPACE = "testNamespace";
34 
35 	protected ConfigurableApplicationContext applicationContext;
36 
37 	/** Subclass must register this */
38 	protected TestListener listener = new TestListener();
39 
40 	protected TestListener parentListener = new TestListener();
41 
setUp()42 	protected void setUp() throws Exception {
43 		this.applicationContext = createContext();
44 	}
45 
getBeanFactory()46 	protected BeanFactory getBeanFactory() {
47 		return applicationContext;
48 	}
49 
getApplicationContext()50 	protected ApplicationContext getApplicationContext() {
51 		return applicationContext;
52 	}
53 
54 	/**
55 	 * Must register a TestListener.
56 	 * Must register standard beans.
57 	 * Parent must register rod with name Roderick
58 	 * and father with name Albert.
59 	 */
createContext()60 	protected abstract ConfigurableApplicationContext createContext() throws Exception;
61 
testContextAwareSingletonWasCalledBack()62 	public void testContextAwareSingletonWasCalledBack() throws Exception {
63 		ACATester aca = (ACATester) applicationContext.getBean("aca");
64 		assertTrue("has had context set", aca.getApplicationContext() == applicationContext);
65 		Object aca2 = applicationContext.getBean("aca");
66 		assertTrue("Same instance", aca == aca2);
67 		assertTrue("Says is singleton", applicationContext.isSingleton("aca"));
68 	}
69 
testContextAwarePrototypeWasCalledBack()70 	public void testContextAwarePrototypeWasCalledBack() throws Exception {
71 		ACATester aca = (ACATester) applicationContext.getBean("aca-prototype");
72 		assertTrue("has had context set", aca.getApplicationContext() == applicationContext);
73 		Object aca2 = applicationContext.getBean("aca-prototype");
74 		assertTrue("NOT Same instance", aca != aca2);
75 		assertTrue("Says is prototype", !applicationContext.isSingleton("aca-prototype"));
76 	}
77 
testParentNonNull()78 	public void testParentNonNull() {
79 		assertTrue("parent isn't null", applicationContext.getParent() != null);
80 	}
81 
testGrandparentNull()82 	public void testGrandparentNull() {
83 		assertTrue("grandparent is null", applicationContext.getParent().getParent() == null);
84 	}
85 
testOverrideWorked()86 	public void testOverrideWorked() throws Exception {
87 		TestBean rod = (TestBean) applicationContext.getParent().getBean("rod");
88 		assertTrue("Parent's name differs", rod.getName().equals("Roderick"));
89 	}
90 
testGrandparentDefinitionFound()91 	public void testGrandparentDefinitionFound() throws Exception {
92 		TestBean dad = (TestBean) applicationContext.getBean("father");
93 		assertTrue("Dad has correct name", dad.getName().equals("Albert"));
94 	}
95 
testGrandparentTypedDefinitionFound()96 	public void testGrandparentTypedDefinitionFound() throws Exception {
97 		TestBean dad = (TestBean) applicationContext.getBean("father", TestBean.class);
98 		assertTrue("Dad has correct name", dad.getName().equals("Albert"));
99 	}
100 
testCloseTriggersDestroy()101 	public void testCloseTriggersDestroy() {
102 		LifecycleBean lb = (LifecycleBean) applicationContext.getBean("lifecycle");
103 		assertTrue("Not destroyed", !lb.isDestroyed());
104 		applicationContext.close();
105 		if (applicationContext.getParent() != null) {
106 			((ConfigurableApplicationContext) applicationContext.getParent()).close();
107 		}
108 		assertTrue("Destroyed", lb.isDestroyed());
109 		applicationContext.close();
110 		if (applicationContext.getParent() != null) {
111 			((ConfigurableApplicationContext) applicationContext.getParent()).close();
112 		}
113 		assertTrue("Destroyed", lb.isDestroyed());
114 	}
115 
testMessageSource()116 	public void testMessageSource() throws NoSuchMessageException {
117 		assertEquals("message1", applicationContext.getMessage("code1", null, Locale.getDefault()));
118 		assertEquals("message2", applicationContext.getMessage("code2", null, Locale.getDefault()));
119 
120 		try {
121 			applicationContext.getMessage("code0", null, Locale.getDefault());
122 			fail("looking for code0 should throw a NoSuchMessageException");
123 		}
124 		catch (NoSuchMessageException ex) {
125 			// that's how it should be
126 		}
127 	}
128 
testEvents()129 	public void testEvents() throws Exception {
130 		listener.zeroCounter();
131 		parentListener.zeroCounter();
132 		assertTrue("0 events before publication", listener.getEventCount() == 0);
133 		assertTrue("0 parent events before publication", parentListener.getEventCount() == 0);
134 		this.applicationContext.publishEvent(new MyEvent(this));
135 		assertTrue("1 events after publication, not " + listener.getEventCount(), listener.getEventCount() == 1);
136 		assertTrue("1 parent events after publication", parentListener.getEventCount() == 1);
137 	}
138 
testBeanAutomaticallyHearsEvents()139 	public void testBeanAutomaticallyHearsEvents() throws Exception {
140 		//String[] listenerNames = ((ListableBeanFactory) applicationContext).getBeanDefinitionNames(ApplicationListener.class);
141 		//assertTrue("listeners include beanThatListens", Arrays.asList(listenerNames).contains("beanThatListens"));
142 		BeanThatListens b = (BeanThatListens) applicationContext.getBean("beanThatListens");
143 		b.zero();
144 		assertTrue("0 events before publication", b.getEventCount() == 0);
145 		this.applicationContext.publishEvent(new MyEvent(this));
146 		assertTrue("1 events after publication, not " + b.getEventCount(), b.getEventCount() == 1);
147 	}
148 
149 
150 	public static class MyEvent extends ApplicationEvent {
151 
MyEvent(Object source)152 		public MyEvent(Object source) {
153 			super(source);
154 		}
155 	}
156 
157 }
158