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.ComponentAdapter;
016    import org.picocontainer.DefaultPicoContainer;
017    import static org.picocontainer.injectors.NamedFieldInjection.injectionFieldNames;
018    import org.picocontainer.annotations.Inject;
019    import org.picocontainer.containers.EmptyPicoContainer;
020    import org.picocontainer.LifecycleStrategy;
021    import org.picocontainer.lifecycle.NullLifecycleStrategy;
022    
023    /**
024     * @author Paul Hammant
025     */
026    public class CompositeInjectionTestCase {
027    
028        public static class Bar {
029        }
030        public static class Baz {
031        }
032    
033        public static class Foo {
034            private final Bar bar;
035            private Baz baz;
036    
037            public Foo(Bar bar) {
038                this.bar = bar;
039            }
040    
041            public void setBaz(Baz baz) {
042                this.baz = baz;
043            }
044        }
045    
046        public static class Foo2 {
047            private final Bar bar;
048            private Baz baz;
049    
050            public Foo2(Bar bar) {
051                this.bar = bar;
052            }
053    
054            public void injectBaz(Baz baz) {
055                this.baz = baz;
056            }
057        }
058    
059        public static class Foo3 {
060            private final Bar bar;
061            private Baz baz;
062    
063            public Foo3(Bar bar) {
064                this.bar = bar;
065            }
066    
067            @Inject
068            public void fjshdfkjhsdkfjh(Baz baz) {
069                this.baz = baz;
070            }
071        }
072        public static class Foo4 {
073            private final Bar bar;
074            private String one;
075            private String two;
076    
077            public Foo4(Bar bar) {
078                this.bar = bar;
079            }
080    
081        }
082    
083        @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
084            DefaultPicoContainer dpc = new DefaultPicoContainer(
085                    new CompositeInjection(new ConstructorInjection(), new SetterInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
086            dpc.addComponent(Bar.class);
087            dpc.addComponent(Baz.class);
088            dpc.addComponent(Foo.class);
089            Foo foo = dpc.getComponent(Foo.class);
090            assertNotNull(foo);
091            assertNotNull(foo.bar);
092            assertNotNull(foo.baz);
093        }
094    
095        @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfiedWithANonSetInjectMethod() throws NoSuchMethodException {
096            DefaultPicoContainer dpc = new DefaultPicoContainer(
097                    new CompositeInjection(new ConstructorInjection(), new SetterInjection("inject")), new NullLifecycleStrategy(), new EmptyPicoContainer());
098            dpc.addComponent(Bar.class);
099            dpc.addComponent(Baz.class);
100            dpc.addComponent(Foo2.class);
101            Foo2 foo = dpc.getComponent(Foo2.class);
102            assertNotNull(foo);
103            assertNotNull(foo.bar);
104            assertNotNull(foo.baz);
105        }
106    
107        @Test public void testComponentWithCtorAndMethodAnnotatedDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
108            DefaultPicoContainer dpc = new DefaultPicoContainer(
109                    new CompositeInjection(new ConstructorInjection(), new AnnotatedMethodInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
110            dpc.addComponent(Bar.class);
111            dpc.addComponent(Baz.class);
112            dpc.addComponent(Foo3.class);
113            Foo3 foo = dpc.getComponent(Foo3.class);
114            assertNotNull(foo);
115            assertNotNull(foo.bar);
116            assertNotNull(foo.baz);
117        }
118    
119    
120        @Test public void testComponentWithCtorAndNamedFieldWorkToegether() throws NoSuchMethodException {
121            DefaultPicoContainer dpc = new DefaultPicoContainer(
122                    new CompositeInjection(new ConstructorInjection(), new NamedFieldInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
123            dpc.addComponent(Bar.class);
124            dpc.addConfig("one", "1");
125            dpc.addConfig("two", "2");
126            dpc.as(injectionFieldNames("one", "two")).addComponent(Foo4.class);
127            Foo4 foo4 = dpc.getComponent(Foo4.class);
128            assertNotNull(foo4);
129            assertNotNull(foo4.bar);
130            assertNotNull(foo4.one);
131            assertEquals("1", foo4.one);
132            assertNotNull(foo4.two);
133            assertEquals("2", foo4.two);
134        }
135    
136        @Test public void testWithNonNullLifecycleStrategy() {
137            DefaultPicoContainer dpc = new DefaultPicoContainer(
138                    new CompositeInjection(new ConstructorInjection(), new AnnotatedMethodInjection()),
139                    new NonNullLifecycleStrategy(),
140                    new EmptyPicoContainer()
141            );
142            dpc.addComponent(Bar.class);
143            assertNotNull(dpc.getComponent(Bar.class));
144        }
145    
146        private static class NonNullLifecycleStrategy implements LifecycleStrategy {
147            public void start(Object component) {
148            }
149    
150            public void stop(Object component) {
151            }
152    
153            public void dispose(Object component) {
154            }
155    
156            public boolean hasLifecycle(Class<?> type) {
157                return false;
158            }
159    
160            public boolean isLazy(ComponentAdapter<?> adapter) {
161                return false;
162            }
163        }
164    }