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 static org.junit.Assert.assertNotNull;
012    import static org.junit.Assert.assertEquals;
013    
014    import org.junit.Test;
015    import org.picocontainer.DefaultPicoContainer;
016    import static org.picocontainer.injectors.NamedFieldInjection.injectionFieldNames;
017    import org.picocontainer.annotations.Inject;
018    import org.picocontainer.containers.EmptyPicoContainer;
019    import org.picocontainer.lifecycle.NullLifecycleStrategy;
020    
021    /**
022     * @author Paul Hammant
023     */
024    public class CompositeInjectionTestCase {
025    
026        public static class Bar {
027        }
028        public static class Baz {
029        }
030    
031        public static class Foo {
032            private final Bar bar;
033            private Baz baz;
034    
035            public Foo(Bar bar) {
036                this.bar = bar;
037            }
038    
039            public void setBaz(Baz baz) {
040                this.baz = baz;
041            }
042        }
043    
044        public static class Foo2 {
045            private final Bar bar;
046            private Baz baz;
047    
048            public Foo2(Bar bar) {
049                this.bar = bar;
050            }
051    
052            public void injectBaz(Baz baz) {
053                this.baz = baz;
054            }
055        }
056    
057        public static class Foo3 {
058            private final Bar bar;
059            private Baz baz;
060    
061            public Foo3(Bar bar) {
062                this.bar = bar;
063            }
064    
065            @Inject
066            public void fjshdfkjhsdkfjh(Baz baz) {
067                this.baz = baz;
068            }
069        }
070        public static class Foo4 {
071            private final Bar bar;
072            private String one;
073            private String two;
074    
075            public Foo4(Bar bar) {
076                this.bar = bar;
077            }
078    
079        }
080    
081        @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
082            DefaultPicoContainer dpc = new DefaultPicoContainer(
083                    new CompositeInjection(new ConstructorInjection(), new SetterInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
084            dpc.addComponent(Bar.class);
085            dpc.addComponent(Baz.class);
086            dpc.addComponent(Foo.class);
087            Foo foo = dpc.getComponent(Foo.class);
088            assertNotNull(foo);
089            assertNotNull(foo.bar);
090            assertNotNull(foo.baz);
091        }
092    
093        @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfiedWithANonSetInjectMethod() throws NoSuchMethodException {
094            DefaultPicoContainer dpc = new DefaultPicoContainer(
095                    new CompositeInjection(new ConstructorInjection(), new SetterInjection("inject")), new NullLifecycleStrategy(), new EmptyPicoContainer());
096            dpc.addComponent(Bar.class);
097            dpc.addComponent(Baz.class);
098            dpc.addComponent(Foo2.class);
099            Foo2 foo = dpc.getComponent(Foo2.class);
100            assertNotNull(foo);
101            assertNotNull(foo.bar);
102            assertNotNull(foo.baz);
103        }
104    
105        @Test public void testComponentWithCtorAndMethodAnnotatedDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
106            DefaultPicoContainer dpc = new DefaultPicoContainer(
107                    new CompositeInjection(new ConstructorInjection(), new AnnotatedMethodInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
108            dpc.addComponent(Bar.class);
109            dpc.addComponent(Baz.class);
110            dpc.addComponent(Foo3.class);
111            Foo3 foo = dpc.getComponent(Foo3.class);
112            assertNotNull(foo);
113            assertNotNull(foo.bar);
114            assertNotNull(foo.baz);
115        }
116    
117    
118        @Test public void testComponentWithCtorAndNamedFieldWorkToegether() throws NoSuchMethodException {
119            DefaultPicoContainer dpc = new DefaultPicoContainer(
120                    new CompositeInjection(new ConstructorInjection(), new NamedFieldInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
121            dpc.addComponent(Bar.class);
122            dpc.addConfig("one", "1");
123            dpc.addConfig("two", "2");
124            dpc.as(injectionFieldNames("one", "two")).addComponent(Foo4.class);
125            Foo4 foo4 = dpc.getComponent(Foo4.class);
126            assertNotNull(foo4);
127            assertNotNull(foo4.bar);
128            assertNotNull(foo4.one);
129            assertEquals("1", foo4.one);
130            assertNotNull(foo4.two);
131            assertEquals("2", foo4.two);
132        }
133    
134    }