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 org.picocontainer.injectors.ConstructorInjection;
012 import org.picocontainer.monitors.NullComponentMonitor;
013 import org.picocontainer.DefaultPicoContainer;
014 import org.picocontainer.ComponentFactory;
015 import org.picocontainer.Characteristics;
016 import org.picocontainer.annotations.Inject;
017 import org.picocontainer.injectors.ConstructorInjector;
018 import org.picocontainer.tck.AbstractComponentFactoryTestCase;
019 import org.picocontainer.tck.AbstractComponentAdapterTestCase.RecordingLifecycleStrategy;
020 import org.picocontainer.testmodel.NullLifecycle;
021 import org.picocontainer.testmodel.RecordingLifecycle;
022 import org.picocontainer.testmodel.RecordingLifecycle.One;
023
024 import junit.framework.TestCase;
025
026 /**
027 * @author Paul Hammant
028 */
029 public class MultiInjectionTestCase extends TestCase {
030
031 public static class Bar {
032 }
033 public static class Baz {
034 }
035 public static class Foo {
036 private final Bar bar;
037 private Baz baz;
038
039 public Foo(Bar bar) {
040 this.bar = bar;
041 }
042
043 public void setBaz(Baz baz) {
044 this.baz = baz;
045 }
046 }
047
048 public static class Foo2 {
049 private final Bar bar;
050 private Baz baz;
051
052 public Foo2(Bar bar) {
053 this.bar = bar;
054 }
055
056 public void injectBaz(Baz baz) {
057 this.baz = baz;
058 }
059 }
060
061 public static class Foo3 {
062 private final Bar bar;
063 private Baz baz;
064
065 public Foo3(Bar bar) {
066 this.bar = bar;
067 }
068
069 @Inject
070 public void fjshdfkjhsdkfjh(Baz baz) {
071 this.baz = baz;
072 }
073 }
074
075 public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
076 DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection());
077 dpc.addComponent(Bar.class);
078 dpc.addComponent(Baz.class);
079 dpc.addComponent(Foo.class);
080 Foo foo = dpc.getComponent(Foo.class);
081 assertNotNull(foo);
082 assertNotNull(foo.bar);
083 assertNotNull(foo.baz);
084 }
085
086 public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfiedWithANonSetInjectMethod() throws NoSuchMethodException {
087 DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection("inject"));
088 dpc.addComponent(Bar.class);
089 dpc.addComponent(Baz.class);
090 dpc.addComponent(Foo2.class);
091 Foo2 foo = dpc.getComponent(Foo2.class);
092 assertNotNull(foo);
093 assertNotNull(foo.bar);
094 assertNotNull(foo.baz);
095 }
096
097 public void testComponentWithCtorAndMethodAnnotatedDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
098 DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection());
099 dpc.addComponent(Bar.class);
100 dpc.addComponent(Baz.class);
101 dpc.addComponent(Foo3.class);
102 Foo3 foo = dpc.getComponent(Foo3.class);
103 assertNotNull(foo);
104 assertNotNull(foo.bar);
105 assertNotNull(foo.baz);
106 }
107
108
109 public void testComponentWithCtorAndSetterDiCanHaveAllCtorDepsAndSomeSetterDepsSatisfiedSubjectToAvailability() throws NoSuchMethodException {
110 DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection());
111 dpc.addComponent(Bar.class);
112 dpc.addComponent(Foo.class);
113 Foo foo = dpc.getComponent(Foo.class);
114 assertNotNull(foo);
115 assertNotNull(foo.bar);
116 assertNull(foo.baz); // baz was never added to the container.s
117 }
118
119 }