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     *****************************************************************************/
009    package org.picocontainer.injectors;
010    
011    import org.picocontainer.injectors.ConstructorInjection;
012    import org.picocontainer.monitors.NullComponentMonitor;
013    import org.picocontainer.DefaultPicoContainer;
014    import org.picocontainer.ComponentFactory;
015    import org.picocontainer.Characteristics;
016    import org.picocontainer.annotations.Inject;
017    import org.picocontainer.injectors.ConstructorInjector;
018    import org.picocontainer.tck.AbstractComponentFactoryTestCase;
019    import org.picocontainer.tck.AbstractComponentAdapterTestCase.RecordingLifecycleStrategy;
020    import org.picocontainer.testmodel.NullLifecycle;
021    import org.picocontainer.testmodel.RecordingLifecycle;
022    import org.picocontainer.testmodel.RecordingLifecycle.One;
023    
024    import junit.framework.TestCase;
025    
026    /**
027     * @author Paul Hammant
028     */
029    public class MultiInjectionTestCase extends TestCase {
030    
031        public static class Bar {
032        }
033        public static class Baz {
034        }
035        public static class Foo {
036            private final Bar bar;
037            private Baz baz;
038    
039            public Foo(Bar bar) {
040                this.bar = bar;
041            }
042    
043            public void setBaz(Baz baz) {
044                this.baz = baz;
045            }
046        }
047    
048        public static class Foo2 {
049            private final Bar bar;
050            private Baz baz;
051    
052            public Foo2(Bar bar) {
053                this.bar = bar;
054            }
055    
056            public void injectBaz(Baz baz) {
057                this.baz = baz;
058            }
059        }
060    
061        public static class Foo3 {
062            private final Bar bar;
063            private Baz baz;
064    
065            public Foo3(Bar bar) {
066                this.bar = bar;
067            }
068    
069            @Inject
070            public void fjshdfkjhsdkfjh(Baz baz) {
071                this.baz = baz;
072            }
073        }
074    
075        public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
076            DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection());
077            dpc.addComponent(Bar.class);
078            dpc.addComponent(Baz.class);
079            dpc.addComponent(Foo.class);
080            Foo foo = dpc.getComponent(Foo.class);
081            assertNotNull(foo);
082            assertNotNull(foo.bar);
083            assertNotNull(foo.baz);
084        }
085    
086        public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfiedWithANonSetInjectMethod() throws NoSuchMethodException {
087            DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection("inject"));
088            dpc.addComponent(Bar.class);
089            dpc.addComponent(Baz.class);
090            dpc.addComponent(Foo2.class);
091            Foo2 foo = dpc.getComponent(Foo2.class);
092            assertNotNull(foo);
093            assertNotNull(foo.bar);
094            assertNotNull(foo.baz);
095        }
096    
097        public void testComponentWithCtorAndMethodAnnotatedDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
098            DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection());
099            dpc.addComponent(Bar.class);
100            dpc.addComponent(Baz.class);
101            dpc.addComponent(Foo3.class);
102            Foo3 foo = dpc.getComponent(Foo3.class);
103            assertNotNull(foo);
104            assertNotNull(foo.bar);
105            assertNotNull(foo.baz);
106        }
107    
108    
109        public void testComponentWithCtorAndSetterDiCanHaveAllCtorDepsAndSomeSetterDepsSatisfiedSubjectToAvailability() throws NoSuchMethodException {
110            DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection());
111            dpc.addComponent(Bar.class);
112            dpc.addComponent(Foo.class);
113            Foo foo = dpc.getComponent(Foo.class);
114            assertNotNull(foo);
115            assertNotNull(foo.bar);
116            assertNull(foo.baz); // baz was never added to the container.s
117        }
118    
119    }