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 *****************************************************************************/ 009package org.picocontainer.injectors; 010 011import static org.junit.Assert.assertNotNull; 012import static org.junit.Assert.assertEquals; 013 014import org.junit.Test; 015import org.picocontainer.ComponentAdapter; 016import org.picocontainer.DefaultPicoContainer; 017import static org.picocontainer.injectors.NamedFieldInjection.injectionFieldNames; 018import org.picocontainer.annotations.Inject; 019import org.picocontainer.containers.EmptyPicoContainer; 020import org.picocontainer.LifecycleStrategy; 021import org.picocontainer.lifecycle.NullLifecycleStrategy; 022 023/** 024 * @author Paul Hammant 025 */ 026public 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}