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