    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.assertTrue;
    013
    014    import org.junit.Test;
    015    import org.picocontainer.DefaultPicoContainer;
    016    import org.picocontainer.annotations.Inject;
    017
    018    /**
    019     * @author Paul Hammant
    020     */
    021    public class MultiInjectionTestCase {
    022
    023        public static class Bar {
    024        }
    025        public static class Baz {
    026        }
    027        public static class Foo {
    028            private final Bar bar;
    029            private Baz baz;
    030
    031            public Foo(Bar bar) {
    032                this.bar = bar;
    033            }
    034
    035            public void setBaz(Baz baz) {
    036                this.baz = baz;
    037            }
    038        }
    039
    040        public static class Foo2 {
    041            private final Bar bar;
    042            private Baz baz;
    043
    044            public Foo2(Bar bar) {
    045                this.bar = bar;
    046            }
    047
    048            public void injectBaz(Baz baz) {
    049                this.baz = baz;
    050            }
    051        }
    052
    053        public static class Foo3 {
    054            private final Bar bar;
    055            private Baz baz;
    056
    057            public Foo3(Bar bar) {
    058                this.bar = bar;
    059            }
    060
    061            @Inject
    062            public void fjshdfkjhsdkfjh(Baz baz) {
    063                this.baz = baz;
    064            }
    065        }
    066
    067        @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
    068            DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection());
    069            dpc.addComponent(Bar.class);
    070            dpc.addComponent(Baz.class);
    071            dpc.addComponent(Foo.class);
    072            Foo foo = dpc.getComponent(Foo.class);
    073            assertNotNull(foo);
    074            assertNotNull(foo.bar);
    075            assertNotNull(foo.baz);
    076        }
    077
    078        @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfiedWithANonSetInjectMethod() throws NoSuchMethodException {
    079            DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection("inject"));
    080            dpc.addComponent(Bar.class);
    081            dpc.addComponent(Baz.class);
    082            dpc.addComponent(Foo2.class);
    083            Foo2 foo = dpc.getComponent(Foo2.class);
    084            assertNotNull(foo);
    085            assertNotNull(foo.bar);
    086            assertNotNull(foo.baz);
    087        }
    088
    089        @Test public void testComponentWithCtorAndMethodAnnotatedDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
    090            DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection());
    091            dpc.addComponent(Bar.class);
    092            dpc.addComponent(Baz.class);
    093            dpc.addComponent(Foo3.class);
    094            Foo3 foo = dpc.getComponent(Foo3.class);
    095            assertNotNull(foo);
    096            assertNotNull(foo.bar);
    097            assertNotNull(foo.baz);
    098        }
    099
    100
    101        @Test public void testComponentWithCtorAndSetterDiCanNoteMissingSetterDependency() throws NoSuchMethodException {
    102            DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection());
    103            dpc.addComponent(Bar.class);
    104            dpc.addComponent(Foo.class);
    105            try {
    106                Foo foo = dpc.getComponent(Foo.class);
    107            } catch (AbstractInjector.UnsatisfiableDependenciesException e) {
    108                assertTrue(e.getMessage().contains(Baz.class.getName()));
    109            }
    110        }
    111
    112    }