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.ComponentAdapter;
016 import org.picocontainer.DefaultPicoContainer;
017 import static org.picocontainer.injectors.NamedFieldInjection.injectionFieldNames;
018 import org.picocontainer.annotations.Inject;
019 import org.picocontainer.containers.EmptyPicoContainer;
020 import org.picocontainer.LifecycleStrategy;
021 import org.picocontainer.lifecycle.NullLifecycleStrategy;
022
023 /**
024 * @author Paul Hammant
025 */
026 public class CompositeInjectionTestCase {
027
028 public static class Bar {
029 }
030 public static class Baz {
031 }
032
033 public static class Foo {
034 private final Bar bar;
035 private Baz baz;
036
037 public Foo(Bar bar) {
038 this.bar = bar;
039 }
040
041 public void setBaz(Baz baz) {
042 this.baz = baz;
043 }
044 }
045
046 public static class Foo2 {
047 private final Bar bar;
048 private Baz baz;
049
050 public Foo2(Bar bar) {
051 this.bar = bar;
052 }
053
054 public void injectBaz(Baz baz) {
055 this.baz = baz;
056 }
057 }
058
059 public static class Foo3 {
060 private final Bar bar;
061 private Baz baz;
062
063 public Foo3(Bar bar) {
064 this.bar = bar;
065 }
066
067 @Inject
068 public void fjshdfkjhsdkfjh(Baz baz) {
069 this.baz = baz;
070 }
071 }
072 public static class Foo4 {
073 private final Bar bar;
074 private String one;
075 private String two;
076
077 public Foo4(Bar bar) {
078 this.bar = bar;
079 }
080
081 }
082
083 @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
084 DefaultPicoContainer dpc = new DefaultPicoContainer(
085 new CompositeInjection(new ConstructorInjection(), new SetterInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
086 dpc.addComponent(Bar.class);
087 dpc.addComponent(Baz.class);
088 dpc.addComponent(Foo.class);
089 Foo foo = dpc.getComponent(Foo.class);
090 assertNotNull(foo);
091 assertNotNull(foo.bar);
092 assertNotNull(foo.baz);
093 }
094
095 @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfiedWithANonSetInjectMethod() throws NoSuchMethodException {
096 DefaultPicoContainer dpc = new DefaultPicoContainer(
097 new CompositeInjection(new ConstructorInjection(), new SetterInjection("inject")), new NullLifecycleStrategy(), new EmptyPicoContainer());
098 dpc.addComponent(Bar.class);
099 dpc.addComponent(Baz.class);
100 dpc.addComponent(Foo2.class);
101 Foo2 foo = dpc.getComponent(Foo2.class);
102 assertNotNull(foo);
103 assertNotNull(foo.bar);
104 assertNotNull(foo.baz);
105 }
106
107 @Test public void testComponentWithCtorAndMethodAnnotatedDiCanHaveAllDepsSatisfied() throws NoSuchMethodException {
108 DefaultPicoContainer dpc = new DefaultPicoContainer(
109 new CompositeInjection(new ConstructorInjection(), new AnnotatedMethodInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
110 dpc.addComponent(Bar.class);
111 dpc.addComponent(Baz.class);
112 dpc.addComponent(Foo3.class);
113 Foo3 foo = dpc.getComponent(Foo3.class);
114 assertNotNull(foo);
115 assertNotNull(foo.bar);
116 assertNotNull(foo.baz);
117 }
118
119
120 @Test public void testComponentWithCtorAndNamedFieldWorkToegether() throws NoSuchMethodException {
121 DefaultPicoContainer dpc = new DefaultPicoContainer(
122 new CompositeInjection(new ConstructorInjection(), new NamedFieldInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
123 dpc.addComponent(Bar.class);
124 dpc.addConfig("one", "1");
125 dpc.addConfig("two", "2");
126 dpc.as(injectionFieldNames("one", "two")).addComponent(Foo4.class);
127 Foo4 foo4 = dpc.getComponent(Foo4.class);
128 assertNotNull(foo4);
129 assertNotNull(foo4.bar);
130 assertNotNull(foo4.one);
131 assertEquals("1", foo4.one);
132 assertNotNull(foo4.two);
133 assertEquals("2", foo4.two);
134 }
135
136 @Test public void testWithNonNullLifecycleStrategy() {
137 DefaultPicoContainer dpc = new DefaultPicoContainer(
138 new CompositeInjection(new ConstructorInjection(), new AnnotatedMethodInjection()),
139 new NonNullLifecycleStrategy(),
140 new EmptyPicoContainer()
141 );
142 dpc.addComponent(Bar.class);
143 assertNotNull(dpc.getComponent(Bar.class));
144 }
145
146 private static class NonNullLifecycleStrategy implements LifecycleStrategy {
147 public void start(Object component) {
148 }
149
150 public void stop(Object component) {
151 }
152
153 public void dispose(Object component) {
154 }
155
156 public boolean hasLifecycle(Class<?> type) {
157 return false;
158 }
159
160 public boolean isLazy(ComponentAdapter<?> adapter) {
161 return false;
162 }
163 }
164 }