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.assertEquals;
013
014 import org.junit.Test;
015 import org.picocontainer.DefaultPicoContainer;
016 import static org.picocontainer.injectors.NamedFieldInjection.injectionFieldNames;
017 import org.picocontainer.annotations.Inject;
018 import org.picocontainer.containers.EmptyPicoContainer;
019 import org.picocontainer.lifecycle.NullLifecycleStrategy;
020
021 /**
022 * @author Paul Hammant
023 */
024 public class CompositeInjectionTestCase {
025
026 public static class Bar {
027 }
028 public static class Baz {
029 }
030
031 public static class Foo {
032 private final Bar bar;
033 private Baz baz;
034
035 public Foo(Bar bar) {
036 this.bar = bar;
037 }
038
039 public void setBaz(Baz baz) {
040 this.baz = baz;
041 }
042 }
043
044 public static class Foo2 {
045 private final Bar bar;
046 private Baz baz;
047
048 public Foo2(Bar bar) {
049 this.bar = bar;
050 }
051
052 public void injectBaz(Baz baz) {
053 this.baz = baz;
054 }
055 }
056
057 public static class Foo3 {
058 private final Bar bar;
059 private Baz baz;
060
061 public Foo3(Bar bar) {
062 this.bar = bar;
063 }
064
065 @Inject
066 public void fjshdfkjhsdkfjh(Baz baz) {
067 this.baz = baz;
068 }
069 }
070 public static class Foo4 {
071 private final Bar bar;
072 private String one;
073 private String two;
074
075 public Foo4(Bar bar) {
076 this.bar = bar;
077 }
078
079 }
080
081 @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
082 DefaultPicoContainer dpc = new DefaultPicoContainer(
083 new CompositeInjection(new ConstructorInjection(), new SetterInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
084 dpc.addComponent(Bar.class);
085 dpc.addComponent(Baz.class);
086 dpc.addComponent(Foo.class);
087 Foo foo = dpc.getComponent(Foo.class);
088 assertNotNull(foo);
089 assertNotNull(foo.bar);
090 assertNotNull(foo.baz);
091 }
092
093 @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfiedWithANonSetInjectMethod() throws NoSuchMethodException {
094 DefaultPicoContainer dpc = new DefaultPicoContainer(
095 new CompositeInjection(new ConstructorInjection(), new SetterInjection("inject")), new NullLifecycleStrategy(), new EmptyPicoContainer());
096 dpc.addComponent(Bar.class);
097 dpc.addComponent(Baz.class);
098 dpc.addComponent(Foo2.class);
099 Foo2 foo = dpc.getComponent(Foo2.class);
100 assertNotNull(foo);
101 assertNotNull(foo.bar);
102 assertNotNull(foo.baz);
103 }
104
105 @Test public void testComponentWithCtorAndMethodAnnotatedDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
106 DefaultPicoContainer dpc = new DefaultPicoContainer(
107 new CompositeInjection(new ConstructorInjection(), new AnnotatedMethodInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
108 dpc.addComponent(Bar.class);
109 dpc.addComponent(Baz.class);
110 dpc.addComponent(Foo3.class);
111 Foo3 foo = dpc.getComponent(Foo3.class);
112 assertNotNull(foo);
113 assertNotNull(foo.bar);
114 assertNotNull(foo.baz);
115 }
116
117
118 @Test public void testComponentWithCtorAndNamedFieldWorkToegether() throws NoSuchMethodException {
119 DefaultPicoContainer dpc = new DefaultPicoContainer(
120 new CompositeInjection(new ConstructorInjection(), new NamedFieldInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
121 dpc.addComponent(Bar.class);
122 dpc.addConfig("one", "1");
123 dpc.addConfig("two", "2");
124 dpc.as(injectionFieldNames("one", "two")).addComponent(Foo4.class);
125 Foo4 foo4 = dpc.getComponent(Foo4.class);
126 assertNotNull(foo4);
127 assertNotNull(foo4.bar);
128 assertNotNull(foo4.one);
129 assertEquals("1", foo4.one);
130 assertNotNull(foo4.two);
131 assertEquals("2", foo4.two);
132 }
133
134 }