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 junit.framework.Assert.assertEquals;
013    import static junit.framework.Assert.fail;
014    import static org.junit.Assert.assertNotNull;
015    import static org.junit.Assert.assertThat;
016    import static org.junit.Assert.assertTrue;
017    
018    import org.junit.Test;
019    import org.picocontainer.DefaultPicoContainer;
020    import org.picocontainer.MutablePicoContainer;
021    import org.picocontainer.lifecycle.NullLifecycleStrategy;
022    import org.picocontainer.monitors.NullComponentMonitor;
023    
024    public class TypedFieldInjectorTestCase {
025    
026        public static class Helicopter {
027            private PogoStick pogo;
028        }
029    
030        public static class PogoStick {
031        }
032    
033        public static class Hulahoop {
034        }
035    
036        @Test public void testFieldInjectionByTypeWhereMatch() {
037            MutablePicoContainer pico = new DefaultPicoContainer();
038            pico.addAdapter(new TypedFieldInjector(Helicopter.class, Helicopter.class, null, new NullComponentMonitor(),
039                    Integer.class.getName() + " " + PogoStick.class.getName() + " " + Float.class.getName()));
040            pico.addComponent(PogoStick.class, new PogoStick());
041            Helicopter chopper = pico.getComponent(Helicopter.class);
042            assertNotNull(chopper);
043            assertNotNull(chopper.pogo);
044        }
045    
046        @Test public void testFieldInjectionByTypeWhereNoMatch() {
047            MutablePicoContainer pico = new DefaultPicoContainer();
048            pico.setName("parent");
049            pico.addAdapter(new TypedFieldInjector(Helicopter.class, Helicopter.class, null, new NullComponentMonitor(),
050                    Integer.class.getName() + " " + PogoStick.class.getName() + " " + Float.class.getName()));
051            pico.addComponent(Hulahoop.class, new Hulahoop());
052            try {
053                pico.getComponent(Helicopter.class);
054                fail("should have barfed");
055            } catch (AbstractInjector.UnsatisfiableDependenciesException e) {
056                String expected = "Helicopter has unsatisfied dependency for fields [PogoStick.pogo] from parent:2<|";
057                String actual = e.getMessage();
058                actual = actual.replace(TypedFieldInjectorTestCase.class.getName() + "$", "");
059                assertEquals(expected, actual);
060            }
061        }
062    
063    }