📄 xmlbeanfactorytestsuite.java
字号:
// Now test distinct bean with swapped value in factory, to ensure the two are independent
OverrideOneMethod swappedOom = (OverrideOneMethod) xbf.getBean("overrideOneMethodSwappedReturnValues");
TestBean tb = swappedOom.getPrototypeDependency();
assertEquals("David", tb.getName());
tb = swappedOom.protectedOverrideSingleton();
assertEquals("Jenny", tb.getName());
}
private void testLookupOverrideMethodsWithSetterInjection(BeanFactory xbf, String beanName, boolean singleton) {
OverrideOneMethod oom = (OverrideOneMethod) xbf.getBean(beanName);
if (singleton) {
assertSame(oom, xbf.getBean(beanName));
}
else {
assertNotSame(oom, xbf.getBean(beanName));
}
TestBean jenny1 = oom.getPrototypeDependency();
assertEquals("Jenny", jenny1.getName());
TestBean jenny2 = oom.getPrototypeDependency();
assertEquals("Jenny", jenny2.getName());
assertNotSame(jenny1, jenny2);
// Check that the bean can invoke the overriden method on itself
// This differs from Spring's AOP support, which has
// a distinct notion of a "target" object, meaning that the
// target needs explicit knowledge of AOP proxying to invoke
// an advised method on itself
TestBean jenny3 = oom.invokesOverridenMethodOnSelf();
assertEquals("Jenny", jenny3.getName());
assertNotSame(jenny1, jenny3);
// Now try protected method, and singleton
TestBean dave1 = oom.protectedOverrideSingleton();
assertEquals("David", dave1.getName());
TestBean dave2 = oom.protectedOverrideSingleton();
assertEquals("David", dave2.getName());
assertSame(dave1, dave2);
}
public void testReplaceMethodOverrideWithSetterInjection() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("delegationOverrides.xml", getClass()));
OverrideOneMethod oom = (OverrideOneMethod) xbf.getBean("overrideOneMethod");
// Same contract as for overrides.xml
TestBean jenny1 = oom.getPrototypeDependency();
assertEquals("Jenny", jenny1.getName());
TestBean jenny2 = oom.getPrototypeDependency();
assertEquals("Jenny", jenny2.getName());
assertNotSame(jenny1, jenny2);
// Now try protected method, and singleton
TestBean dave1 = oom.protectedOverrideSingleton();
assertEquals("David", dave1.getName());
TestBean dave2 = oom.protectedOverrideSingleton();
assertEquals("David", dave2.getName());
assertSame(dave1, dave2);
// Check unadvised behaviour
String str = "woierowijeiowiej";
assertEquals(str, oom.echo(str));
// Now test replace
String s = "this is not a palindrome";
String reverse = new StringBuffer(s).reverse().toString();
assertEquals("Should have overridden to reverse, not echo", reverse, oom.replaceMe(s));
assertEquals("Should have overridden no-arg overloaded replaceMe method to return fixed value",
FixedMethodReplacer.VALUE, oom.replaceMe());
OverrideOneMethodSubclass ooms = (OverrideOneMethodSubclass) xbf.getBean("replaceVoidMethod");
DoSomethingReplacer dos = (DoSomethingReplacer) xbf.getBean("doSomethingReplacer");
assertEquals(null, dos.lastArg);
String s1 = "";
String s2 = "foo bar black sheep";
ooms.doSomething(s1);
assertEquals(s1, dos.lastArg);
ooms.doSomething(s2);
assertEquals(s2, dos.lastArg);
}
public void testLookupOverrideOneMethodWithConstructorInjection() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("constructorOverrides.xml", getClass()));
ConstructorInjectedOverrides cio = (ConstructorInjectedOverrides) xbf.getBean("constructorOverrides");
// Check that the setter was invoked...
// We should be able to combine Constructor and
// Setter Injection
assertEquals("Setter string was set", "from property element", cio.getSetterString());
// Jenny is a singleton
TestBean jenny = (TestBean) xbf.getBean("jenny");
assertSame(jenny, cio.getTestBean());
assertSame(jenny, cio.getTestBean());
FactoryMethods fm1 = cio.createFactoryMethods();
FactoryMethods fm2 = cio.createFactoryMethods();
assertNotSame("FactoryMethods reference is to a prototype", fm1, fm2);
assertSame("The two prototypes hold the same singleton reference",
fm1.getTestBean(), fm2.getTestBean());
}
public void testRejectsOverrideOfBogusMethodName() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
try {
reader.loadBeanDefinitions(new ClassPathResource("invalidOverridesNoSuchMethod.xml", getClass()));
fail("Shouldn't allow override of bogus method");
}
catch (BeanDefinitionStoreException ex) {
// Check that the bogus method name was included in the error message
assertTrue("Bogus method name correctly reported", ex.getMessage().indexOf("bogusMethod") != -1);
}
}
/**
* Assert the presence of this bug until we resolve
* it
* @throws Exception
*/
public void testSerializabilityOfMethodReplacer() throws Exception {
try {
BUGtestSerializableMethodReplacerAndSuperclass();
fail();
}
catch (AssertionFailedError ex) {
System.err.println("****** SPR-356: Objects with MethodReplace overrides are not serializable");
}
}
public void BUGtestSerializableMethodReplacerAndSuperclass() throws IOException, ClassNotFoundException {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("delegationOverrides.xml", getClass()));
SerializableMethodReplacerCandidate s = (SerializableMethodReplacerCandidate) xbf.getBean("serializableReplacer");
String forwards = "this is forwards";
String backwards = new StringBuffer(forwards).reverse().toString();
assertEquals(backwards, s.replaceMe(forwards));
assertTrue(SerializationTestUtils.isSerializable(s));
s = (SerializableMethodReplacerCandidate) SerializationTestUtils.serializeAndDeserialize(s);
assertEquals("Method replace still works after serialization and deserialization", backwards, s.replaceMe(forwards));
}
public void testFactoryMethodsSingletonOnTargetClass() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));
FactoryMethods fm = (FactoryMethods) xbf.getBean("default");
assertEquals(0, fm.getNum());
assertEquals("default", fm.getName());
assertEquals("defaultInstance", fm.getTestBean().getName());
assertEquals("setterString", fm.getStringValue());
fm = (FactoryMethods) xbf.getBean("testBeanOnly");
assertEquals(0, fm.getNum());
assertEquals("default", fm.getName());
// This comes from the test bean
assertEquals("Juergen", fm.getTestBean().getName());
fm = (FactoryMethods) xbf.getBean("full");
assertEquals(27, fm.getNum());
assertEquals("gotcha", fm.getName());
assertEquals("Juergen", fm.getTestBean().getName());
FactoryMethods fm2 = (FactoryMethods) xbf.getBean("full");
assertSame(fm, fm2);
}
public void testFactoryMethodsPrototypeOnTargetClass() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));
FactoryMethods fm = (FactoryMethods) xbf.getBean("defaultPrototype");
FactoryMethods fm2 = (FactoryMethods) xbf.getBean("defaultPrototype");
assertEquals(0, fm.getNum());
assertEquals("default", fm.getName());
assertEquals("defaultInstance", fm.getTestBean().getName());
assertEquals("setterString", fm.getStringValue());
assertEquals(fm.getNum(), fm2.getNum());
assertEquals(fm.getStringValue(), fm2.getStringValue());
// The TestBean is created separately for each bean
assertNotSame(fm.getTestBean(), fm2.getTestBean());
assertNotSame(fm, fm2);
fm = (FactoryMethods) xbf.getBean("testBeanOnlyPrototype");
fm2 = (FactoryMethods) xbf.getBean("testBeanOnlyPrototype");
assertEquals(0, fm.getNum());
assertEquals("default", fm.getName());
// This comes from the test bean
assertEquals("Juergen", fm.getTestBean().getName());
assertEquals(fm.getNum(), fm2.getNum());
assertEquals(fm.getStringValue(), fm2.getStringValue());
// The TestBean reference is resolved to a prototype in the factory
assertSame(fm.getTestBean(), fm2.getTestBean());
assertNotSame(fm, fm2);
fm = (FactoryMethods) xbf.getBean("fullPrototype");
fm2 = (FactoryMethods) xbf.getBean("fullPrototype");
assertEquals(27, fm.getNum());
assertEquals("gotcha", fm.getName());
assertEquals("Juergen", fm.getTestBean().getName());
assertEquals(fm.getNum(), fm2.getNum());
assertEquals(fm.getStringValue(), fm2.getStringValue());
// The TestBean reference is resolved to a prototype in the factory
assertSame(fm.getTestBean(), fm2.getTestBean());
assertNotSame(fm, fm2);
}
/**
* Tests where the static factory method is on a different class
*
*/
public void testFactoryMethodsOnExternalClass() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));
TestBean tb = (TestBean) xbf.getBean("externalFactoryMethodWithoutArgs");
assertEquals(2, tb.getAge());
assertEquals("Tristan", tb.getName());
tb = (TestBean) xbf.getBean("externalFactoryMethodWithArgs");
assertEquals(33, tb.getAge());
assertEquals("Rod", tb.getName());
}
public void testInstanceFactoryMethodWithoutArgs() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));
FactoryMethods fm = (FactoryMethods) xbf.getBean("instanceFactoryMethodWithoutArgs");
assertEquals("instanceFactory", fm.getTestBean().getName());
//tb = (TestBean) xbf.getBean("externalFactoryMethodWithArgs");
//assertEquals(33, tb.getAge());
//assertEquals("Rod", tb.getName());
}
public void testFactoryMethodNoMatchingStaticMethod() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));
try{
xbf.getBean("noMatchPrototype");
fail("No static method matched");
}
catch (BeanCreationException ex) {
// Ok
}
}
public void testCanSpecifyFactoryMethodArgumentsOnFactoryMethodPrototype() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));
TestBean tbArg = new TestBean();
tbArg.setName("arg1");
TestBean tbArg2 = new TestBean();
tbArg2.setName("arg2");
FactoryMethods fm1 = (FactoryMethods) xbf.getBean("testBeanOnlyPrototype", new Object[] { tbArg });
FactoryMethods fm2 = (FactoryMethods) xbf.getBean("testBeanOnlyPrototype", new Object[] { tbArg2 });
assertEquals(0, fm1.getNum());
assertEquals("default", fm1.getName());
// This comes from the test bean
assertEquals("arg1", fm1.getTestBean().getName());
assertEquals("arg2", fm2.getTestBean().getName());
assertEquals(fm1.getNum(), fm2.getNum());
assertEquals(fm2.getStringValue(), "testBeanOnlyPrototypeDISetterString");
assertEquals(fm2.getStringValue(), fm2.getStringValue());
// The TestBean reference is resolved to a prototype in the factory
assertSame(fm2.getTestBean(), fm2.getTestBean());
assertNotSame(fm1, fm2);
}
public void testCannotSpecifyFactoryMethodArgumentsOnSingleton() {
DefaultListableBeanFactory xbf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(xbf);
reader.setValidating(true);
reader.loadBeanDefinitions(new ClassPathResource("factory-methods.xml", getClass()));
try {
xbf.getBean("testBeanOnly", new Object[] { new TestBean() });
fail("Shouldn't allow args to be passed to a singleton");
}
catch (BeanDefinitionStoreException ex) {
// OK
}
}
public void testCannotSpecifyFactoryMethodArgumentsExceptWithFactoryMet
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -