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 * Idea by Rachel Davies, Original code by Stacy Curl * 009 *****************************************************************************/ 010 011 package org.picocontainer.injectors; 012 013 import static org.junit.Assert.assertEquals; 014 import static org.junit.Assert.assertNotNull; 015 import static org.junit.Assert.assertTrue; 016 017 import java.util.HashMap; 018 import java.util.Map; 019 import java.util.Properties; 020 021 import org.junit.Before; 022 import org.junit.Test; 023 import org.picocontainer.Characteristics; 024 import org.picocontainer.ComponentAdapter; 025 import org.picocontainer.ComponentFactory; 026 import org.picocontainer.DefaultPicoContainer; 027 import org.picocontainer.Parameter; 028 import org.picocontainer.PicoCompositionException; 029 import org.picocontainer.lifecycle.NullLifecycleStrategy; 030 import org.picocontainer.lifecycle.ReflectionLifecycleStrategy; 031 import org.picocontainer.monitors.ConsoleComponentMonitor; 032 import org.picocontainer.monitors.NullComponentMonitor; 033 import org.picocontainer.tck.AbstractComponentFactoryTest; 034 import org.picocontainer.testmodel.SimpleTouchable; 035 import org.picocontainer.testmodel.Touchable; 036 037 import com.thoughtworks.xstream.XStream; 038 import com.thoughtworks.xstream.converters.Converter; 039 import com.thoughtworks.xstream.converters.MarshallingContext; 040 import com.thoughtworks.xstream.converters.UnmarshallingContext; 041 import com.thoughtworks.xstream.io.HierarchicalStreamReader; 042 import com.thoughtworks.xstream.io.HierarchicalStreamWriter; 043 044 public class AdaptingInjectionTestCase extends AbstractComponentFactoryTest { 045 046 XStream xs; 047 048 @Before 049 public void setUp() throws Exception { 050 super.setUp(); 051 xs = new XStream(); 052 xs.alias("RLS", ReflectionLifecycleStrategy.class); 053 xs.alias("CCM", ConsoleComponentMonitor.class); 054 xs.alias("Method-Injection", AnnotatedMethodInjector.class); 055 xs.alias("Field-Injection", AnnotatedFieldInjector.class); 056 xs.alias("Constructor-Injection", ConstructorInjector.class); 057 //xs.alias("CCM", ConsoleComponentMonitor.class); 058 xs.registerConverter(new Converter() { 059 public boolean canConvert(Class aClass) { 060 return aClass.getName().equals("org.picocontainer.monitors.ConsoleComponentMonitor") || 061 aClass.getName().equals("org.picocontainer.lifecycle.ReflectionLifecycleStrategy"); 062 063 } 064 065 public void marshal(Object object, 066 HierarchicalStreamWriter hierarchicalStreamWriter, 067 MarshallingContext marshallingContext) 068 { 069 } 070 071 public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, 072 UnmarshallingContext unmarshallingContext) 073 { 074 return null; 075 } 076 }); 077 078 } 079 080 protected ComponentFactory createComponentFactory() { 081 return new AdaptingInjection(); 082 } 083 084 @Test public void testInstantiateComponentWithNoDependencies() throws PicoCompositionException { 085 ComponentAdapter componentAdapter = 086 createComponentFactory().createComponentAdapter(new NullComponentMonitor(), 087 new NullLifecycleStrategy(), 088 new Properties(Characteristics.CDI), 089 Touchable.class, 090 SimpleTouchable.class, 091 (Parameter[])null); 092 093 Object comp = componentAdapter.getComponentInstance(new DefaultPicoContainer(), ComponentAdapter.NOTHING.class); 094 assertNotNull(comp); 095 assertTrue(comp instanceof SimpleTouchable); 096 } 097 098 @Test public void testSingleUsecanBeInstantiatedByDefaultComponentAdapter() { 099 ComponentAdapter componentAdapter = createComponentFactory().createComponentAdapter(new NullComponentMonitor(), 100 new NullLifecycleStrategy(), 101 new Properties( 102 Characteristics.CDI), 103 "o", 104 Object.class, 105 (Parameter[])null); 106 Object component = componentAdapter.getComponentInstance(new DefaultPicoContainer(), ComponentAdapter.NOTHING.class); 107 assertNotNull(component); 108 } 109 110 111 @Test public void testFactoryMakesConstructorInjector() { 112 113 ComponentFactory cf = createComponentFactory(); 114 115 ConsoleComponentMonitor cm = new ConsoleComponentMonitor(); 116 ComponentAdapter ca = cf.createComponentAdapter(cm, new NullLifecycleStrategy(), new Properties(), 117 Map.class, HashMap.class, Parameter.DEFAULT); 118 119 String foo = xs.toXML(ca).replace("\"", ""); 120 121 assertEquals("<Constructor-Injection>\n" + 122 " <componentKey class=java-class>java.util.Map</componentKey>\n" + 123 " <componentImplementation>java.util.HashMap</componentImplementation>\n" + 124 " <componentMonitor class=CCM/>\n" + 125 " <useNames>false</useNames>\n" + 126 " <rememberChosenConstructor>true</rememberChosenConstructor>\n" + 127 " <enableEmjection>false</enableEmjection>\n" + 128 "</Constructor-Injection>", foo); 129 130 131 } 132 133 @Test public void testFactoryMakesFieldAnnotationInjector() { 134 135 ComponentFactory cf = createComponentFactory(); 136 137 ConsoleComponentMonitor cm = new ConsoleComponentMonitor(); 138 ComponentAdapter ca = cf.createComponentAdapter(cm, 139 new NullLifecycleStrategy(), 140 new Properties(), 141 AnnotatedFieldInjectorTestCase.Helicopter.class, 142 AnnotatedFieldInjectorTestCase.Helicopter.class, 143 Parameter.DEFAULT); 144 145 String foo = xs.toXML(ca).replace("\"", ""); 146 147 assertEquals("<Field-Injection>\n" + 148 " <componentKey class=java-class>org.picocontainer.injectors.AnnotatedFieldInjectorTestCase$Helicopter</componentKey>\n" + 149 " <componentImplementation>org.picocontainer.injectors.AnnotatedFieldInjectorTestCase$Helicopter</componentImplementation>\n" + 150 " <componentMonitor class=CCM/>\n" + 151 " <useNames>false</useNames>\n" + 152 " <injectionAnnotation>org.picocontainer.annotations.Inject</injectionAnnotation>\n" + 153 "</Field-Injection>", foo); 154 155 156 } 157 158 @Test public void testFactoryMakesMethodAnnotationInjector() { 159 160 ComponentFactory cf = createComponentFactory(); 161 162 ConsoleComponentMonitor cm = new ConsoleComponentMonitor(); 163 ComponentAdapter ca = cf.createComponentAdapter(cm, 164 new NullLifecycleStrategy(), 165 new Properties(), 166 AnnotatedMethodInjectorTestCase.AnnotatedBurp.class, 167 AnnotatedMethodInjectorTestCase.AnnotatedBurp.class, 168 Parameter.DEFAULT); 169 170 String foo = xs.toXML(ca).replace("\"", ""); 171 172 assertEquals("<Method-Injection>\n" + 173 " <componentKey class=java-class>org.picocontainer.injectors.AnnotatedMethodInjectorTestCase$AnnotatedBurp</componentKey>\n" + 174 " <componentImplementation>org.picocontainer.injectors.AnnotatedMethodInjectorTestCase$AnnotatedBurp</componentImplementation>\n" + 175 " <componentMonitor class=CCM/>\n" + 176 " <useNames>false</useNames>\n" + 177 " <prefix></prefix>\n" + 178 " <injectionAnnotation>org.picocontainer.annotations.Inject</injectionAnnotation>\n" + 179 "</Method-Injection>", foo); 180 181 182 } 183 184 185 }