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