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 }