001 package org.picocontainer.foo; 002 003 import org.junit.Test; 004 import org.picocontainer.Characteristics; 005 import org.picocontainer.DefaultPicoContainer; 006 import org.picocontainer.Emjection; 007 import org.picocontainer.MutablePicoContainer; 008 import org.picocontainer.behaviors.Caching; 009 010 import static junit.framework.Assert.assertEquals; 011 import static junit.framework.Assert.assertSame; 012 import static org.junit.Assert.assertNotSame; 013 import static org.picocontainer.Characteristics.EMJECTION_ENABLED; 014 015 public class EmjectionTestCase { 016 017 @Test 018 public void basicEmjection() { 019 StringBuilder sb = new StringBuilder(); 020 MutablePicoContainer pico = new DefaultPicoContainer(); 021 pico.addComponent(Antelope.class); 022 pico.as(EMJECTION_ENABLED).addComponent(ZooKeeper.class); 023 pico.addComponent(sb); 024 ZooKeeper zooKeeper = pico.getComponent(ZooKeeper.class); 025 zooKeeper.doHeadCount(); 026 assertEquals("giraffe=true, antelope=true", sb.toString()); 027 } 028 029 030 @Test 031 public void testThatTransientNatureOfAdhocDependencies() { 032 MutablePicoContainer pico = new DefaultPicoContainer(new Caching()); 033 pico.addComponent(Antelope.class); 034 pico.as(EMJECTION_ENABLED).addComponent(ZooKeeper.class); 035 pico.addComponent(new StringBuilder()); 036 ZooKeeper component = pico.getComponent(ZooKeeper.class); 037 component.doHeadCount(); 038 Zoo zoo1 = component.zoo; 039 component = pico.getComponent(ZooKeeper.class); 040 component.doHeadCount(); 041 Zoo zoo2 = component.zoo; 042 zoo2.headCount(); 043 assertNotSame(zoo1, zoo2); // made one the fly 044 assertNotSame(zoo1.giraffe, zoo2.giraffe); // made one the fly 045 assertSame(zoo1.antelope, zoo2.antelope); // in the parent-most picocontainer 046 assertSame(zoo1.sb, zoo2.sb); // in the parent-most picocontainer 047 } 048 049 050 public static class Zoo { 051 private final Emjection emjection = new Emjection(); 052 053 private Giraffe giraffe; 054 private Antelope antelope; 055 private StringBuilder sb; 056 057 public Zoo(Giraffe giraffe, Antelope antelope, StringBuilder sb) { 058 this.giraffe = giraffe; 059 this.antelope = antelope; 060 this.sb = sb; 061 } 062 063 public void headCount() { 064 sb.append("giraffe=").append(giraffe != null); 065 sb.append(", antelope=").append(antelope != null); 066 } 067 } 068 069 070 public static class ZooKeeper { 071 072 private final Emjection emjection = new Emjection(); 073 private Zoo zoo; 074 075 public void doHeadCount() { 076 zoo = neu(Zoo.class, new Giraffe()); 077 zoo.headCount(); 078 } 079 080 <T> T neu(Class<T> type, Object... args) { 081 return Emjection.neu(type, emjection, args); 082 } 083 084 } 085 086 public static class Giraffe { 087 } 088 public static class Antelope { 089 } 090 091 092 }