Browse Source
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@399 50f2f4bb-b051-0410-bef5-90022cba6387pull/1/head
5 changed files with 469 additions and 60 deletions
@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
|
||||
/* |
||||
* Copyright 2002-2005 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.beans; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
import junit.framework.TestCase; |
||||
|
||||
/** |
||||
* @author Rod Johnson |
||||
*/ |
||||
public abstract class AbstractPropertyValuesTests extends TestCase { |
||||
|
||||
/** |
||||
* Must contain: forname=Tony surname=Blair age=50 |
||||
*/ |
||||
protected void doTestTony(PropertyValues pvs) throws Exception { |
||||
assertTrue("Contains 3", pvs.getPropertyValues().length == 3); |
||||
assertTrue("Contains forname", pvs.contains("forname")); |
||||
assertTrue("Contains surname", pvs.contains("surname")); |
||||
assertTrue("Contains age", pvs.contains("age")); |
||||
assertTrue("Doesn't contain tory", !pvs.contains("tory")); |
||||
|
||||
PropertyValue[] ps = pvs.getPropertyValues(); |
||||
Map m = new HashMap(); |
||||
m.put("forname", "Tony"); |
||||
m.put("surname", "Blair"); |
||||
m.put("age", "50"); |
||||
for (int i = 0; i < ps.length; i++) { |
||||
Object val = m.get(ps[i].getName()); |
||||
assertTrue("Can't have unexpected value", val != null); |
||||
assertTrue("Val i string", val instanceof String); |
||||
assertTrue("val matches expected", val.equals(ps[i].getValue())); |
||||
m.remove(ps[i].getName()); |
||||
} |
||||
assertTrue("Map size is 0", m.size() == 0); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,329 @@
@@ -0,0 +1,329 @@
|
||||
/* |
||||
* Copyright 2002-2008 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.beans.factory; |
||||
|
||||
import java.beans.PropertyEditorSupport; |
||||
import java.util.StringTokenizer; |
||||
|
||||
import junit.framework.TestCase; |
||||
import junit.framework.Assert; |
||||
|
||||
import org.springframework.beans.BeansException; |
||||
import org.springframework.beans.PropertyBatchUpdateException; |
||||
import org.springframework.beans.TestBean; |
||||
import org.springframework.beans.factory.config.ConfigurableBeanFactory; |
||||
|
||||
/** |
||||
* Subclasses must implement setUp() to initialize bean factory |
||||
* and any other variables they need. |
||||
* |
||||
* @author Rod Johnson |
||||
* @author Juergen Hoeller |
||||
*/ |
||||
public abstract class AbstractBeanFactoryTests extends TestCase { |
||||
|
||||
protected abstract BeanFactory getBeanFactory(); |
||||
|
||||
/** |
||||
* Roderick beans inherits from rod, overriding name only. |
||||
*/ |
||||
public void testInheritance() { |
||||
assertTrue(getBeanFactory().containsBean("rod")); |
||||
assertTrue(getBeanFactory().containsBean("roderick")); |
||||
TestBean rod = (TestBean) getBeanFactory().getBean("rod"); |
||||
TestBean roderick = (TestBean) getBeanFactory().getBean("roderick"); |
||||
assertTrue("not == ", rod != roderick); |
||||
assertTrue("rod.name is Rod", rod.getName().equals("Rod")); |
||||
assertTrue("rod.age is 31", rod.getAge() == 31); |
||||
assertTrue("roderick.name is Roderick", roderick.getName().equals("Roderick")); |
||||
assertTrue("roderick.age was inherited", roderick.getAge() == rod.getAge()); |
||||
} |
||||
|
||||
public void testGetBeanWithNullArg() { |
||||
try { |
||||
getBeanFactory().getBean(null); |
||||
fail("Can't get null bean"); |
||||
} |
||||
catch (IllegalArgumentException ex) { |
||||
// OK
|
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Test that InitializingBean objects receive the afterPropertiesSet() callback |
||||
*/ |
||||
public void testInitializingBeanCallback() { |
||||
MustBeInitialized mbi = (MustBeInitialized) getBeanFactory().getBean("mustBeInitialized"); |
||||
// The dummy business method will throw an exception if the
|
||||
// afterPropertiesSet() callback wasn't invoked
|
||||
mbi.businessMethod(); |
||||
} |
||||
|
||||
/** |
||||
* Test that InitializingBean/BeanFactoryAware/DisposableBean objects receive the |
||||
* afterPropertiesSet() callback before BeanFactoryAware callbacks |
||||
*/ |
||||
public void testLifecycleCallbacks() { |
||||
LifecycleBean lb = (LifecycleBean) getBeanFactory().getBean("lifecycle"); |
||||
Assert.assertEquals("lifecycle", lb.getBeanName()); |
||||
// The dummy business method will throw an exception if the
|
||||
// necessary callbacks weren't invoked in the right order.
|
||||
lb.businessMethod(); |
||||
assertTrue("Not destroyed", !lb.isDestroyed()); |
||||
} |
||||
|
||||
public void testFindsValidInstance() { |
||||
try { |
||||
Object o = getBeanFactory().getBean("rod"); |
||||
assertTrue("Rod bean is a TestBean", o instanceof TestBean); |
||||
TestBean rod = (TestBean) o; |
||||
assertTrue("rod.name is Rod", rod.getName().equals("Rod")); |
||||
assertTrue("rod.age is 31", rod.getAge() == 31); |
||||
} |
||||
catch (Exception ex) { |
||||
ex.printStackTrace(); |
||||
fail("Shouldn't throw exception on getting valid instance"); |
||||
} |
||||
} |
||||
|
||||
public void testGetInstanceByMatchingClass() { |
||||
try { |
||||
Object o = getBeanFactory().getBean("rod", TestBean.class); |
||||
assertTrue("Rod bean is a TestBean", o instanceof TestBean); |
||||
} |
||||
catch (Exception ex) { |
||||
ex.printStackTrace(); |
||||
fail("Shouldn't throw exception on getting valid instance with matching class"); |
||||
} |
||||
} |
||||
|
||||
public void testGetInstanceByNonmatchingClass() { |
||||
try { |
||||
Object o = getBeanFactory().getBean("rod", BeanFactory.class); |
||||
fail("Rod bean is not of type BeanFactory; getBeanInstance(rod, BeanFactory.class) should throw BeanNotOfRequiredTypeException"); |
||||
} |
||||
catch (BeanNotOfRequiredTypeException ex) { |
||||
// So far, so good
|
||||
assertTrue("Exception has correct bean name", ex.getBeanName().equals("rod")); |
||||
assertTrue("Exception requiredType must be BeanFactory.class", ex.getRequiredType().equals(BeanFactory.class)); |
||||
assertTrue("Exception actualType as TestBean.class", TestBean.class.isAssignableFrom(ex.getActualType())); |
||||
assertTrue("Actual type is correct", ex.getActualType() == getBeanFactory().getBean("rod").getClass()); |
||||
} |
||||
catch (Exception ex) { |
||||
ex.printStackTrace(); |
||||
fail("Shouldn't throw exception on getting valid instance"); |
||||
} |
||||
} |
||||
|
||||
public void testGetSharedInstanceByMatchingClass() { |
||||
try { |
||||
Object o = getBeanFactory().getBean("rod", TestBean.class); |
||||
assertTrue("Rod bean is a TestBean", o instanceof TestBean); |
||||
} |
||||
catch (Exception ex) { |
||||
ex.printStackTrace(); |
||||
fail("Shouldn't throw exception on getting valid instance with matching class"); |
||||
} |
||||
} |
||||
|
||||
public void testGetSharedInstanceByMatchingClassNoCatch() { |
||||
Object o = getBeanFactory().getBean("rod", TestBean.class); |
||||
assertTrue("Rod bean is a TestBean", o instanceof TestBean); |
||||
} |
||||
|
||||
public void testGetSharedInstanceByNonmatchingClass() { |
||||
try { |
||||
Object o = getBeanFactory().getBean("rod", BeanFactory.class); |
||||
fail("Rod bean is not of type BeanFactory; getBeanInstance(rod, BeanFactory.class) should throw BeanNotOfRequiredTypeException"); |
||||
} |
||||
catch (BeanNotOfRequiredTypeException ex) { |
||||
// So far, so good
|
||||
assertTrue("Exception has correct bean name", ex.getBeanName().equals("rod")); |
||||
assertTrue("Exception requiredType must be BeanFactory.class", ex.getRequiredType().equals(BeanFactory.class)); |
||||
assertTrue("Exception actualType as TestBean.class", TestBean.class.isAssignableFrom(ex.getActualType())); |
||||
} |
||||
catch (Exception ex) { |
||||
ex.printStackTrace(); |
||||
fail("Shouldn't throw exception on getting valid instance"); |
||||
} |
||||
} |
||||
|
||||
public void testSharedInstancesAreEqual() { |
||||
try { |
||||
Object o = getBeanFactory().getBean("rod"); |
||||
assertTrue("Rod bean1 is a TestBean", o instanceof TestBean); |
||||
Object o1 = getBeanFactory().getBean("rod"); |
||||
assertTrue("Rod bean2 is a TestBean", o1 instanceof TestBean); |
||||
assertTrue("Object equals applies", o == o1); |
||||
} |
||||
catch (Exception ex) { |
||||
ex.printStackTrace(); |
||||
fail("Shouldn't throw exception on getting valid instance"); |
||||
} |
||||
} |
||||
|
||||
public void testPrototypeInstancesAreIndependent() { |
||||
TestBean tb1 = (TestBean) getBeanFactory().getBean("kathy"); |
||||
TestBean tb2 = (TestBean) getBeanFactory().getBean("kathy"); |
||||
assertTrue("ref equal DOES NOT apply", tb1 != tb2); |
||||
assertTrue("object equal true", tb1.equals(tb2)); |
||||
tb1.setAge(1); |
||||
tb2.setAge(2); |
||||
assertTrue("1 age independent = 1", tb1.getAge() == 1); |
||||
assertTrue("2 age independent = 2", tb2.getAge() == 2); |
||||
assertTrue("object equal now false", !tb1.equals(tb2)); |
||||
} |
||||
|
||||
public void testNotThere() { |
||||
assertFalse(getBeanFactory().containsBean("Mr Squiggle")); |
||||
try { |
||||
Object o = getBeanFactory().getBean("Mr Squiggle"); |
||||
fail("Can't find missing bean"); |
||||
} |
||||
catch (BeansException ex) { |
||||
//ex.printStackTrace();
|
||||
//fail("Shouldn't throw exception on getting valid instance");
|
||||
} |
||||
} |
||||
|
||||
public void testValidEmpty() { |
||||
try { |
||||
Object o = getBeanFactory().getBean("validEmpty"); |
||||
assertTrue("validEmpty bean is a TestBean", o instanceof TestBean); |
||||
TestBean ve = (TestBean) o; |
||||
assertTrue("Valid empty has defaults", ve.getName() == null && ve.getAge() == 0 && ve.getSpouse() == null); |
||||
} |
||||
catch (BeansException ex) { |
||||
ex.printStackTrace(); |
||||
fail("Shouldn't throw exception on valid empty"); |
||||
} |
||||
} |
||||
|
||||
public void xtestTypeMismatch() { |
||||
try { |
||||
Object o = getBeanFactory().getBean("typeMismatch"); |
||||
fail("Shouldn't succeed with type mismatch"); |
||||
} |
||||
catch (BeanCreationException wex) { |
||||
assertEquals("typeMismatch", wex.getBeanName()); |
||||
assertTrue(wex.getCause() instanceof PropertyBatchUpdateException); |
||||
PropertyBatchUpdateException ex = (PropertyBatchUpdateException) wex.getCause(); |
||||
// Further tests
|
||||
assertTrue("Has one error ", ex.getExceptionCount() == 1); |
||||
assertTrue("Error is for field age", ex.getPropertyAccessException("age") != null); |
||||
assertTrue("We have rejected age in exception", ex.getPropertyAccessException("age").getPropertyChangeEvent().getNewValue().equals("34x")); |
||||
} |
||||
} |
||||
|
||||
public void testGrandparentDefinitionFoundInBeanFactory() throws Exception { |
||||
TestBean dad = (TestBean) getBeanFactory().getBean("father"); |
||||
assertTrue("Dad has correct name", dad.getName().equals("Albert")); |
||||
} |
||||
|
||||
public void testFactorySingleton() throws Exception { |
||||
assertTrue(getBeanFactory().isSingleton("&singletonFactory")); |
||||
assertTrue(getBeanFactory().isSingleton("singletonFactory")); |
||||
TestBean tb = (TestBean) getBeanFactory().getBean("singletonFactory"); |
||||
assertTrue("Singleton from factory has correct name, not " + tb.getName(), tb.getName().equals(DummyFactory.SINGLETON_NAME)); |
||||
DummyFactory factory = (DummyFactory) getBeanFactory().getBean("&singletonFactory"); |
||||
TestBean tb2 = (TestBean) getBeanFactory().getBean("singletonFactory"); |
||||
assertTrue("Singleton references ==", tb == tb2); |
||||
assertTrue("FactoryBean is BeanFactoryAware", factory.getBeanFactory() != null); |
||||
} |
||||
|
||||
public void testFactoryPrototype() throws Exception { |
||||
assertTrue(getBeanFactory().isSingleton("&prototypeFactory")); |
||||
assertFalse(getBeanFactory().isSingleton("prototypeFactory")); |
||||
TestBean tb = (TestBean) getBeanFactory().getBean("prototypeFactory"); |
||||
assertTrue(!tb.getName().equals(DummyFactory.SINGLETON_NAME)); |
||||
TestBean tb2 = (TestBean) getBeanFactory().getBean("prototypeFactory"); |
||||
assertTrue("Prototype references !=", tb != tb2); |
||||
} |
||||
|
||||
/** |
||||
* Check that we can get the factory bean itself. |
||||
* This is only possible if we're dealing with a factory |
||||
* @throws Exception |
||||
*/ |
||||
public void testGetFactoryItself() throws Exception { |
||||
DummyFactory factory = (DummyFactory) getBeanFactory().getBean("&singletonFactory"); |
||||
assertTrue(factory != null); |
||||
} |
||||
|
||||
/** |
||||
* Check that afterPropertiesSet gets called on factory |
||||
* @throws Exception |
||||
*/ |
||||
public void testFactoryIsInitialized() throws Exception { |
||||
TestBean tb = (TestBean) getBeanFactory().getBean("singletonFactory"); |
||||
DummyFactory factory = (DummyFactory) getBeanFactory().getBean("&singletonFactory"); |
||||
assertTrue("Factory was initialized because it implemented InitializingBean", factory.wasInitialized()); |
||||
} |
||||
|
||||
/** |
||||
* It should be illegal to dereference a normal bean |
||||
* as a factory |
||||
*/ |
||||
public void testRejectsFactoryGetOnNormalBean() { |
||||
try { |
||||
getBeanFactory().getBean("&rod"); |
||||
fail("Shouldn't permit factory get on normal bean"); |
||||
} |
||||
catch (BeanIsNotAFactoryException ex) { |
||||
// Ok
|
||||
} |
||||
} |
||||
|
||||
// TODO: refactor in AbstractBeanFactory (tests for AbstractBeanFactory)
|
||||
// and rename this class
|
||||
public void testAliasing() { |
||||
BeanFactory bf = getBeanFactory(); |
||||
if (!(bf instanceof ConfigurableBeanFactory)) { |
||||
return; |
||||
} |
||||
ConfigurableBeanFactory cbf = (ConfigurableBeanFactory) bf; |
||||
|
||||
String alias = "rods alias"; |
||||
try { |
||||
cbf.getBean(alias); |
||||
fail("Shouldn't permit factory get on normal bean"); |
||||
} |
||||
catch (NoSuchBeanDefinitionException ex) { |
||||
// Ok
|
||||
assertTrue(alias.equals(ex.getBeanName())); |
||||
} |
||||
|
||||
// Create alias
|
||||
cbf.registerAlias("rod", alias); |
||||
Object rod = getBeanFactory().getBean("rod"); |
||||
Object aliasRod = getBeanFactory().getBean(alias); |
||||
assertTrue(rod == aliasRod); |
||||
} |
||||
|
||||
|
||||
public static class TestBeanEditor extends PropertyEditorSupport { |
||||
|
||||
public void setAsText(String text) { |
||||
TestBean tb = new TestBean(); |
||||
StringTokenizer st = new StringTokenizer(text, "_"); |
||||
tb.setName(st.nextToken()); |
||||
tb.setAge(Integer.parseInt(st.nextToken())); |
||||
setValue(tb); |
||||
} |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,86 @@
@@ -0,0 +1,86 @@
|
||||
/* |
||||
* Copyright 2002-2007 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.beans.factory; |
||||
|
||||
import junit.framework.Assert; |
||||
|
||||
import org.springframework.beans.TestBean; |
||||
|
||||
/** |
||||
* @author Rod Johnson |
||||
* @author Juergen Hoeller |
||||
*/ |
||||
public abstract class AbstractListableBeanFactoryTests extends AbstractBeanFactoryTests { |
||||
|
||||
/** Subclasses must initialize this */ |
||||
protected ListableBeanFactory getListableBeanFactory() { |
||||
BeanFactory bf = getBeanFactory(); |
||||
if (!(bf instanceof ListableBeanFactory)) { |
||||
throw new IllegalStateException("ListableBeanFactory required"); |
||||
} |
||||
return (ListableBeanFactory) bf; |
||||
} |
||||
|
||||
/** |
||||
* Subclasses can override this. |
||||
*/ |
||||
public void testCount() { |
||||
assertCount(13); |
||||
} |
||||
|
||||
protected final void assertCount(int count) { |
||||
String[] defnames = getListableBeanFactory().getBeanDefinitionNames(); |
||||
Assert.assertTrue("We should have " + count + " beans, not " + defnames.length, defnames.length == count); |
||||
} |
||||
|
||||
public void assertTestBeanCount(int count) { |
||||
String[] defNames = getListableBeanFactory().getBeanNamesForType(TestBean.class, true, false); |
||||
Assert.assertTrue("We should have " + count + " beans for class org.springframework.beans.TestBean, not " + |
||||
defNames.length, defNames.length == count); |
||||
|
||||
int countIncludingFactoryBeans = count + 2; |
||||
String[] names = getListableBeanFactory().getBeanNamesForType(TestBean.class, true, true); |
||||
Assert.assertTrue("We should have " + countIncludingFactoryBeans + |
||||
" beans for class org.springframework.beans.TestBean, not " + names.length, |
||||
names.length == countIncludingFactoryBeans); |
||||
} |
||||
|
||||
public void testGetDefinitionsForNoSuchClass() { |
||||
String[] defnames = getListableBeanFactory().getBeanNamesForType(String.class); |
||||
Assert.assertTrue("No string definitions", defnames.length == 0); |
||||
} |
||||
|
||||
/** |
||||
* Check that count refers to factory class, not bean class. (We don't know |
||||
* what type factories may return, and it may even change over time.) |
||||
*/ |
||||
public void testGetCountForFactoryClass() { |
||||
Assert.assertTrue("Should have 2 factories, not " + |
||||
getListableBeanFactory().getBeanNamesForType(FactoryBean.class).length, |
||||
getListableBeanFactory().getBeanNamesForType(FactoryBean.class).length == 2); |
||||
|
||||
Assert.assertTrue("Should have 2 factories, not " + |
||||
getListableBeanFactory().getBeanNamesForType(FactoryBean.class).length, |
||||
getListableBeanFactory().getBeanNamesForType(FactoryBean.class).length == 2); |
||||
} |
||||
|
||||
public void testContainsBeanDefinition() { |
||||
Assert.assertTrue(getListableBeanFactory().containsBeanDefinition("rod")); |
||||
Assert.assertTrue(getListableBeanFactory().containsBeanDefinition("roderick")); |
||||
} |
||||
|
||||
} |
||||
@ -1,25 +0,0 @@
@@ -1,25 +0,0 @@
|
||||
/* |
||||
* Copyright 2002-2005 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.beans.support; |
||||
|
||||
/** |
||||
* @author Juergen Hoeller |
||||
* @since 29.07.2004 |
||||
*/ |
||||
public class DerivedFromProtectedBaseBean extends ProtectedBaseBean { |
||||
|
||||
} |
||||
@ -1,35 +0,0 @@
@@ -1,35 +0,0 @@
|
||||
/* |
||||
* Copyright 2002-2005 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.beans.support; |
||||
|
||||
/** |
||||
* @author Juergen Hoeller |
||||
* @since 29.07.2004 |
||||
*/ |
||||
class ProtectedBaseBean { |
||||
|
||||
private String someProperty; |
||||
|
||||
public void setSomeProperty(String someProperty) { |
||||
this.someProperty = someProperty; |
||||
} |
||||
|
||||
public String getSomeProperty() { |
||||
return someProperty; |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue