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.assertTrue; 013 014 import org.junit.Test; 015 import org.picocontainer.DefaultPicoContainer; 016 import org.picocontainer.annotations.Inject; 017 018 /** 019 * @author Paul Hammant 020 */ 021 public class MultiInjectionTestCase { 022 023 public static class Bar { 024 } 025 public static class Baz { 026 } 027 public static class Foo { 028 private final Bar bar; 029 private Baz baz; 030 031 public Foo(Bar bar) { 032 this.bar = bar; 033 } 034 035 public void setBaz(Baz baz) { 036 this.baz = baz; 037 } 038 } 039 040 public static class Foo2 { 041 private final Bar bar; 042 private Baz baz; 043 044 public Foo2(Bar bar) { 045 this.bar = bar; 046 } 047 048 public void injectBaz(Baz baz) { 049 this.baz = baz; 050 } 051 } 052 053 public static class Foo3 { 054 private final Bar bar; 055 private Baz baz; 056 057 public Foo3(Bar bar) { 058 this.bar = bar; 059 } 060 061 @Inject 062 public void fjshdfkjhsdkfjh(Baz baz) { 063 this.baz = baz; 064 } 065 } 066 067 @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfied() throws NoSuchMethodException { 068 DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection()); 069 dpc.addComponent(Bar.class); 070 dpc.addComponent(Baz.class); 071 dpc.addComponent(Foo.class); 072 Foo foo = dpc.getComponent(Foo.class); 073 assertNotNull(foo); 074 assertNotNull(foo.bar); 075 assertNotNull(foo.baz); 076 } 077 078 @Test public void testComponentWithCtorAndSetterDiCanHaveAllDepsSatisfiedWithANonSetInjectMethod() throws NoSuchMethodException { 079 DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection("inject")); 080 dpc.addComponent(Bar.class); 081 dpc.addComponent(Baz.class); 082 dpc.addComponent(Foo2.class); 083 Foo2 foo = dpc.getComponent(Foo2.class); 084 assertNotNull(foo); 085 assertNotNull(foo.bar); 086 assertNotNull(foo.baz); 087 } 088 089 @Test public void testComponentWithCtorAndMethodAnnotatedDiCanHaveAllDepsSatisfied() throws NoSuchMethodException { 090 DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection()); 091 dpc.addComponent(Bar.class); 092 dpc.addComponent(Baz.class); 093 dpc.addComponent(Foo3.class); 094 Foo3 foo = dpc.getComponent(Foo3.class); 095 assertNotNull(foo); 096 assertNotNull(foo.bar); 097 assertNotNull(foo.baz); 098 } 099 100 101 @Test public void testComponentWithCtorAndSetterDiCanNoteMissingSetterDependency() throws NoSuchMethodException { 102 DefaultPicoContainer dpc = new DefaultPicoContainer(new MultiInjection()); 103 dpc.addComponent(Bar.class); 104 dpc.addComponent(Foo.class); 105 try { 106 Foo foo = dpc.getComponent(Foo.class); 107 } catch (AbstractInjector.UnsatisfiableDependenciesException e) { 108 assertTrue(e.getMessage().contains(Baz.class.getName())); 109 } 110 } 111 112 }