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