001 /*****************************************************************************
002 * Copyright (C) PicoContainer Organization. All rights reserved. *
003 * ------------------------------------------------------------------------- *
004 * The software in this package is published under the terms of the BSD *
005 * style license a copy of which has been included with this distribution in *
006 * the LICENSE.txt file. *
007 * *
008 * Idea by Rachel Davies, Original code by Aslak Hellesoy and Paul Hammant *
009 *****************************************************************************/
010 package org.picocontainer.defaults;
011
012 import org.picocontainer.Parameter;
013 import org.picocontainer.PicoInitializationException;
014 import org.picocontainer.tck.AbstractComponentAdapterFactoryTestCase;
015 import org.picocontainer.tck.AbstractComponentAdapterTestCase.RecordingLifecycleStrategy;
016 import org.picocontainer.testmodel.NullLifecycle;
017 import org.picocontainer.testmodel.RecordingLifecycle;
018 import org.picocontainer.testmodel.RecordingLifecycle.One;
019
020 /**
021 * @author Jörg Schaible</a>
022 * @version $Revision: 3139 $
023 */
024 public class SetterInjectionComponentAdapterFactoryTestCase extends AbstractComponentAdapterFactoryTestCase {
025 protected void setUp() throws Exception {
026 picoContainer = new DefaultPicoContainer(createComponentAdapterFactory());
027 }
028
029 protected ComponentAdapterFactory createComponentAdapterFactory() {
030 return new SetterInjectionComponentAdapterFactory();
031 }
032
033 public static interface Bean {
034 }
035
036 public static class NamedBean implements Bean {
037 private String name;
038
039 public String getName() {
040 return name;
041 }
042
043 public void setName(String name) {
044 this.name = name;
045 }
046 }
047
048 public static class NamedBeanWithPossibleDefault extends NamedBean {
049 private boolean byDefault;
050
051 public NamedBeanWithPossibleDefault() {
052 }
053
054 public NamedBeanWithPossibleDefault(String name) {
055 setName(name);
056 byDefault = true;
057 }
058
059 public boolean getByDefault() {
060 return byDefault;
061 }
062 }
063
064 public static class NoBean extends NamedBean {
065 public NoBean(String name) {
066 setName(name);
067 }
068 }
069
070 public void testContainerUsesStandardConstructor() {
071 picoContainer.registerComponentImplementation(Bean.class, NamedBeanWithPossibleDefault.class);
072 picoContainer.registerComponentInstance("Tom");
073 NamedBeanWithPossibleDefault bean = (NamedBeanWithPossibleDefault) picoContainer.getComponentInstance(Bean.class);
074 assertFalse(bean.getByDefault());
075 }
076
077 public void testContainerUsesOnlyStandardConstructor() {
078 picoContainer.registerComponentImplementation(Bean.class, NoBean.class);
079 picoContainer.registerComponentInstance("Tom");
080 try {
081 picoContainer.getComponentInstance(Bean.class);
082 fail("Instantiation should have failed.");
083 } catch (PicoInitializationException e) {
084 }
085 }
086
087 public void testCustomLifecycleCanBeInjected() throws NoSuchMethodException {
088 RecordingLifecycleStrategy strategy = new RecordingLifecycleStrategy(new StringBuffer());
089 SetterInjectionComponentAdapterFactory caf = new SetterInjectionComponentAdapterFactory(false, strategy);
090 SetterInjectionComponentAdapter sica = (SetterInjectionComponentAdapter)caf.createComponentAdapter(NullLifecycle.class, NullLifecycle.class, new Parameter[0]);
091 One one = new RecordingLifecycle.One(new StringBuffer());
092 sica.start(one);
093 sica.stop(one);
094 sica.dispose(one);
095 assertEquals("<start<stop<dispose", strategy.recording());
096 }
097 }