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