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