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