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     * Original code by                                                          *
009     *****************************************************************************/
010    package org.picocontainer.injectors;
011    
012    import org.picocontainer.annotations.Inject;
013    import org.picocontainer.MutablePicoContainer;
014    import org.picocontainer.DefaultPicoContainer;
015    import org.picocontainer.lifecycle.NullLifecycleStrategy;
016    import org.picocontainer.monitors.NullComponentMonitor;
017    
018    import java.lang.annotation.Retention;
019    import java.lang.annotation.RetentionPolicy;
020    import java.lang.annotation.Target;
021    import java.lang.annotation.ElementType;
022    
023    import junit.framework.TestCase;
024    
025    public class AnnotatedFieldInjectorTestCase extends TestCase {
026    
027        public static class Helicopter {
028            @Inject
029            private PogoStick pogo;
030    
031            public Helicopter() {
032            }
033        }
034    
035        public static class Helicopter2 {
036            private PogoStick pogo;
037    
038            public Helicopter2() {
039            }
040        }
041    
042        public static class PogoStick {
043        }
044    
045        public void testFieldInjection() {
046            MutablePicoContainer pico = new DefaultPicoContainer();
047            pico.addAdapter(new AnnotatedFieldInjector(Helicopter.class, Helicopter.class, null,
048                                                        new NullComponentMonitor(), new NullLifecycleStrategy(), Inject.class));
049            pico.addComponent(PogoStick.class, new PogoStick());
050            Helicopter chopper = pico.getComponent(Helicopter.class);
051            assertNotNull(chopper);
052            assertNotNull(chopper.pogo);
053        }
054    
055        public void testFieldInjectionWithoutAnnotationDoesNotWork() {
056            MutablePicoContainer pico = new DefaultPicoContainer();
057            pico.addAdapter(new AnnotatedFieldInjector(Helicopter2.class, Helicopter2.class, null,
058                                                        new NullComponentMonitor(), new NullLifecycleStrategy(), Inject.class));
059            pico.addComponent(PogoStick.class, new PogoStick());
060            Helicopter2 chopper = pico.getComponent(Helicopter2.class);
061            assertNotNull(chopper);
062            assertNull(chopper.pogo);
063        }
064    
065        public void testFieldDeosNotHappenWithoutRightInjectorDoesNotWork() {
066            MutablePicoContainer pico = new DefaultPicoContainer();
067            pico.addAdapter(new SetterInjector(Helicopter.class, Helicopter.class, null,
068                                                        new NullComponentMonitor(), new NullLifecycleStrategy(),
069                                                        "set"));
070            pico.addComponent(PogoStick.class, new PogoStick());
071            Helicopter chopper = pico.getComponent(Helicopter.class);
072            assertNotNull(chopper);
073            assertNull(chopper.pogo);
074        }
075    
076        @Retention(RetentionPolicy.RUNTIME)
077        @Target(value={ ElementType.METHOD, ElementType.FIELD})
078        public @interface AlternativeInject {
079        }
080    
081        public static class Helicopter3 {
082            @AlternativeInject
083            private PogoStick pogo;
084    
085            public Helicopter3() {
086            }
087        }
088    
089        public void testFieldInjectionWithAlternativeInjectionAnnotation() {
090            MutablePicoContainer pico = new DefaultPicoContainer();
091            pico.addAdapter(new AnnotatedFieldInjector(Helicopter3.class, Helicopter3.class, null,
092                                                        new NullComponentMonitor(), new NullLifecycleStrategy(), AlternativeInject.class));
093            pico.addComponent(PogoStick.class, new PogoStick());
094            Helicopter3 chopper = pico.getComponent(Helicopter3.class);
095            assertNotNull(chopper);
096            assertNotNull(chopper.pogo);
097        }
098    
099    }