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