1 /* 2 * Copyright 2002-2007 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.beans.factory.xml; 18 19 import java.util.Arrays; 20 import java.util.HashMap; 21 import java.util.List; 22 import java.util.Map; 23 24 import junit.framework.Assert; 25 26 import org.springframework.beans.BeansException; 27 import org.springframework.beans.MutablePropertyValues; 28 import org.springframework.beans.factory.BeanFactory; 29 import org.springframework.beans.factory.config.BeanPostProcessor; 30 import org.springframework.beans.factory.support.DefaultListableBeanFactory; 31 import org.springframework.beans.factory.support.RootBeanDefinition; 32 import org.springframework.core.io.ClassPathResource; 33 34 import test.beans.DummyFactory; 35 import test.beans.ITestBean; 36 import test.beans.LifecycleBean; 37 import test.beans.TestBean; 38 39 /** 40 * @author Juergen Hoeller 41 * @since 09.11.2003 42 */ 43 public class XmlListableBeanFactoryTests extends AbstractListableBeanFactoryTests { 44 45 private DefaultListableBeanFactory parent; 46 47 private XmlBeanFactory factory; 48 setUp()49 protected void setUp() { 50 parent = new DefaultListableBeanFactory(); 51 Map m = new HashMap(); 52 m.put("name", "Albert"); 53 parent.registerBeanDefinition("father", 54 new RootBeanDefinition(TestBean.class, new MutablePropertyValues(m))); 55 m = new HashMap(); 56 m.put("name", "Roderick"); 57 parent.registerBeanDefinition("rod", 58 new RootBeanDefinition(TestBean.class, new MutablePropertyValues(m))); 59 60 this.factory = new XmlBeanFactory(new ClassPathResource("test.xml", getClass()), parent); 61 this.factory.addBeanPostProcessor(new BeanPostProcessor() { 62 public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException { 63 if (bean instanceof TestBean) { 64 ((TestBean) bean).setPostProcessed(true); 65 } 66 if (bean instanceof DummyFactory) { 67 ((DummyFactory) bean).setPostProcessed(true); 68 } 69 return bean; 70 } 71 public Object postProcessAfterInitialization(Object bean, String name) throws BeansException { 72 return bean; 73 } 74 }); 75 this.factory.addBeanPostProcessor(new LifecycleBean.PostProcessor()); 76 this.factory.addBeanPostProcessor(new ProtectedLifecycleBean.PostProcessor()); 77 //this.factory.preInstantiateSingletons(); 78 } 79 getBeanFactory()80 protected BeanFactory getBeanFactory() { 81 return factory; 82 } 83 testCount()84 public void testCount() { 85 assertCount(24); 86 } 87 testTestBeanCount()88 public void testTestBeanCount() { 89 assertTestBeanCount(13); 90 } 91 testLifecycleMethods()92 public void testLifecycleMethods() throws Exception { 93 LifecycleBean bean = (LifecycleBean) getBeanFactory().getBean("lifecycle"); 94 bean.businessMethod(); 95 } 96 testProtectedLifecycleMethods()97 public void testProtectedLifecycleMethods() throws Exception { 98 ProtectedLifecycleBean bean = (ProtectedLifecycleBean) getBeanFactory().getBean("protectedLifecycle"); 99 bean.businessMethod(); 100 } 101 testDescriptionButNoProperties()102 public void testDescriptionButNoProperties() throws Exception { 103 TestBean validEmpty = (TestBean) getBeanFactory().getBean("validEmptyWithDescription"); 104 Assert.assertEquals(0, validEmpty.getAge()); 105 } 106 107 /** 108 * Test that properties with name as well as id creating an alias up front. 109 */ testAutoAliasing()110 public void testAutoAliasing() throws Exception { 111 List beanNames = Arrays.asList(getListableBeanFactory().getBeanDefinitionNames()); 112 113 TestBean tb1 = (TestBean) getBeanFactory().getBean("aliased"); 114 TestBean alias1 = (TestBean) getBeanFactory().getBean("myalias"); 115 Assert.assertTrue(tb1 == alias1); 116 List tb1Aliases = Arrays.asList(getBeanFactory().getAliases("aliased")); 117 Assert.assertEquals(2, tb1Aliases.size()); 118 Assert.assertTrue(tb1Aliases.contains("myalias")); 119 Assert.assertTrue(tb1Aliases.contains("youralias")); 120 Assert.assertTrue(beanNames.contains("aliased")); 121 Assert.assertFalse(beanNames.contains("myalias")); 122 Assert.assertFalse(beanNames.contains("youralias")); 123 124 TestBean tb2 = (TestBean) getBeanFactory().getBean("multiAliased"); 125 TestBean alias2 = (TestBean) getBeanFactory().getBean("alias1"); 126 TestBean alias3 = (TestBean) getBeanFactory().getBean("alias2"); 127 TestBean alias3a = (TestBean) getBeanFactory().getBean("alias3"); 128 TestBean alias3b = (TestBean) getBeanFactory().getBean("alias4"); 129 Assert.assertTrue(tb2 == alias2); 130 Assert.assertTrue(tb2 == alias3); 131 Assert.assertTrue(tb2 == alias3a); 132 Assert.assertTrue(tb2 == alias3b); 133 134 List tb2Aliases = Arrays.asList(getBeanFactory().getAliases("multiAliased")); 135 Assert.assertEquals(4, tb2Aliases.size()); 136 Assert.assertTrue(tb2Aliases.contains("alias1")); 137 Assert.assertTrue(tb2Aliases.contains("alias2")); 138 Assert.assertTrue(tb2Aliases.contains("alias3")); 139 Assert.assertTrue(tb2Aliases.contains("alias4")); 140 Assert.assertTrue(beanNames.contains("multiAliased")); 141 Assert.assertFalse(beanNames.contains("alias1")); 142 Assert.assertFalse(beanNames.contains("alias2")); 143 Assert.assertFalse(beanNames.contains("alias3")); 144 Assert.assertFalse(beanNames.contains("alias4")); 145 146 TestBean tb3 = (TestBean) getBeanFactory().getBean("aliasWithoutId1"); 147 TestBean alias4 = (TestBean) getBeanFactory().getBean("aliasWithoutId2"); 148 TestBean alias5 = (TestBean) getBeanFactory().getBean("aliasWithoutId3"); 149 Assert.assertTrue(tb3 == alias4); 150 Assert.assertTrue(tb3 == alias5); 151 List tb3Aliases = Arrays.asList(getBeanFactory().getAliases("aliasWithoutId1")); 152 Assert.assertEquals(2, tb3Aliases.size()); 153 Assert.assertTrue(tb3Aliases.contains("aliasWithoutId2")); 154 Assert.assertTrue(tb3Aliases.contains("aliasWithoutId3")); 155 Assert.assertTrue(beanNames.contains("aliasWithoutId1")); 156 Assert.assertFalse(beanNames.contains("aliasWithoutId2")); 157 Assert.assertFalse(beanNames.contains("aliasWithoutId3")); 158 159 TestBean tb4 = (TestBean) getBeanFactory().getBean(TestBean.class.getName() + "#0"); 160 Assert.assertEquals(null, tb4.getName()); 161 162 Map drs = getListableBeanFactory().getBeansOfType(DummyReferencer.class, false, false); 163 Assert.assertEquals(5, drs.size()); 164 Assert.assertTrue(drs.containsKey(DummyReferencer.class.getName() + "#0")); 165 Assert.assertTrue(drs.containsKey(DummyReferencer.class.getName() + "#1")); 166 Assert.assertTrue(drs.containsKey(DummyReferencer.class.getName() + "#2")); 167 } 168 testFactoryNesting()169 public void testFactoryNesting() { 170 ITestBean father = (ITestBean) getBeanFactory().getBean("father"); 171 Assert.assertTrue("Bean from root context", father != null); 172 173 TestBean rod = (TestBean) getBeanFactory().getBean("rod"); 174 Assert.assertTrue("Bean from child context", "Rod".equals(rod.getName())); 175 Assert.assertTrue("Bean has external reference", rod.getSpouse() == father); 176 177 rod = (TestBean) parent.getBean("rod"); 178 Assert.assertTrue("Bean from root context", "Roderick".equals(rod.getName())); 179 } 180 testFactoryReferences()181 public void testFactoryReferences() { 182 DummyFactory factory = (DummyFactory) getBeanFactory().getBean("&singletonFactory"); 183 184 DummyReferencer ref = (DummyReferencer) getBeanFactory().getBean("factoryReferencer"); 185 Assert.assertTrue(ref.getTestBean1() == ref.getTestBean2()); 186 Assert.assertTrue(ref.getDummyFactory() == factory); 187 188 DummyReferencer ref2 = (DummyReferencer) getBeanFactory().getBean("factoryReferencerWithConstructor"); 189 Assert.assertTrue(ref2.getTestBean1() == ref2.getTestBean2()); 190 Assert.assertTrue(ref2.getDummyFactory() == factory); 191 } 192 testPrototypeReferences()193 public void testPrototypeReferences() { 194 // check that not broken by circular reference resolution mechanism 195 DummyReferencer ref1 = (DummyReferencer) getBeanFactory().getBean("prototypeReferencer"); 196 Assert.assertTrue("Not referencing same bean twice", ref1.getTestBean1() != ref1.getTestBean2()); 197 DummyReferencer ref2 = (DummyReferencer) getBeanFactory().getBean("prototypeReferencer"); 198 Assert.assertTrue("Not the same referencer", ref1 != ref2); 199 Assert.assertTrue("Not referencing same bean twice", ref2.getTestBean1() != ref2.getTestBean2()); 200 Assert.assertTrue("Not referencing same bean twice", ref1.getTestBean1() != ref2.getTestBean1()); 201 Assert.assertTrue("Not referencing same bean twice", ref1.getTestBean2() != ref2.getTestBean2()); 202 Assert.assertTrue("Not referencing same bean twice", ref1.getTestBean1() != ref2.getTestBean2()); 203 } 204 testBeanPostProcessor()205 public void testBeanPostProcessor() throws Exception { 206 TestBean kerry = (TestBean) getBeanFactory().getBean("kerry"); 207 TestBean kathy = (TestBean) getBeanFactory().getBean("kathy"); 208 DummyFactory factory = (DummyFactory) getBeanFactory().getBean("&singletonFactory"); 209 TestBean factoryCreated = (TestBean) getBeanFactory().getBean("singletonFactory"); 210 Assert.assertTrue(kerry.isPostProcessed()); 211 Assert.assertTrue(kathy.isPostProcessed()); 212 Assert.assertTrue(factory.isPostProcessed()); 213 Assert.assertTrue(factoryCreated.isPostProcessed()); 214 } 215 testEmptyValues()216 public void testEmptyValues() { 217 TestBean rod = (TestBean) getBeanFactory().getBean("rod"); 218 TestBean kerry = (TestBean) getBeanFactory().getBean("kerry"); 219 Assert.assertTrue("Touchy is empty", "".equals(rod.getTouchy())); 220 Assert.assertTrue("Touchy is empty", "".equals(kerry.getTouchy())); 221 } 222 testCommentsAndCdataInValue()223 public void testCommentsAndCdataInValue() { 224 TestBean bean = (TestBean) getBeanFactory().getBean("commentsInValue"); 225 Assert.assertEquals("Failed to handle comments and CDATA properly", "this is a <!--comment-->", bean.getName()); 226 } 227 228 } 229