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 * Original code by * 009 *****************************************************************************/ 010 package org.picocontainer.injectors; 011 012 import static org.junit.Assert.assertEquals; 013 import static org.junit.Assert.assertNotNull; 014 import static org.junit.Assert.assertTrue; 015 import static org.junit.Assert.fail; 016 017 import java.lang.reflect.Method; 018 019 import org.junit.Test; 020 import org.picocontainer.Characteristics; 021 import org.picocontainer.DefaultPicoContainer; 022 import org.picocontainer.MutablePicoContainer; 023 import org.picocontainer.PicoBuilder; 024 import static org.picocontainer.Characteristics.USE_NAMES; 025 import org.picocontainer.annotations.Nullable; 026 import org.picocontainer.containers.EmptyPicoContainer; 027 import org.picocontainer.lifecycle.NullLifecycleStrategy; 028 import org.picocontainer.monitors.NullComponentMonitor; 029 030 public class MethodInjectionTestCase { 031 032 public static interface IFoo { 033 void inject(Bar bar, Integer num); 034 } 035 public static class Foo implements IFoo { 036 private Bar bar; 037 private Integer num; 038 039 public void inject(Bar bar, Integer num) { 040 this.bar = bar; 041 this.num = num; 042 } 043 } 044 045 public static class Bar { 046 public Bar() { 047 } 048 } 049 050 @Test public void testMethodInjection() { 051 DefaultPicoContainer pico = new DefaultPicoContainer(new MethodInjection(), new NullLifecycleStrategy(), new EmptyPicoContainer()); 052 pico.addComponent(123); 053 pico.addComponent(Foo.class); 054 pico.addComponent(Bar.class); 055 Foo foo = pico.getComponent(Foo.class); 056 assertNotNull(foo.bar); 057 assertNotNull(foo.num); 058 assertEquals("MethodInjector-class org.picocontainer.injectors.MethodInjectionTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 059 } 060 061 @Test public void testMethodInjectionViaMethodDef() { 062 Method mthd = Foo.class.getMethods()[0]; 063 DefaultPicoContainer pico = new DefaultPicoContainer(new MethodInjection(mthd), new NullLifecycleStrategy(), new EmptyPicoContainer()); 064 pico.addComponent(123); 065 pico.addComponent(Foo.class); 066 pico.addComponent(new Bar()); 067 Foo foo = pico.getComponent(Foo.class); 068 assertNotNull(foo.bar); 069 assertNotNull(foo.num); 070 assertEquals("ReflectionMethodInjector["+mthd+"]-class org.picocontainer.injectors.MethodInjectionTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 071 } 072 073 @Test public void testMethodInjectionViaMethodDefViaInterface() { 074 Method mthd = IFoo.class.getMethods()[0]; 075 DefaultPicoContainer pico = new DefaultPicoContainer(new MethodInjection(mthd), new NullLifecycleStrategy(), new EmptyPicoContainer()); 076 pico.addComponent(123); 077 pico.addComponent(Foo.class); 078 pico.addComponent(new Bar()); 079 Foo foo = pico.getComponent(Foo.class); 080 assertNotNull(foo.bar); 081 assertNotNull(foo.num); 082 assertEquals("ReflectionMethodInjector["+mthd+"]-class org.picocontainer.injectors.MethodInjectionTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 083 } 084 085 086 @Test public void testMethodInjectionViaCharacteristics() { 087 DefaultPicoContainer pico = new DefaultPicoContainer(new NullLifecycleStrategy(), new EmptyPicoContainer()); 088 pico.addComponent(123); 089 pico.as(Characteristics.METHOD_INJECTION).addComponent(Foo.class); 090 pico.addComponent(Bar.class); 091 Foo foo = pico.getComponent(Foo.class); 092 assertNotNull(foo.bar); 093 assertNotNull(foo.num); 094 assertEquals("MethodInjector-class org.picocontainer.injectors.MethodInjectionTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 095 } 096 097 @Test public void testMethodInjectionViaAdapter() { 098 DefaultPicoContainer pico = new DefaultPicoContainer(new MethodInjection()); 099 pico.addComponent(123); 100 pico.addAdapter(new MethodInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), "inject", false)); 101 pico.addComponent(Bar.class); 102 Foo foo = pico.getComponent(Foo.class); 103 assertNotNull(foo.bar); 104 assertNotNull(foo.num); 105 assertEquals("MethodInjector-class org.picocontainer.injectors.MethodInjectionTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 106 } 107 108 @Test public void testMethodInjectionByBuilder() { 109 MutablePicoContainer pico = new PicoBuilder().withMethodInjection().build(); 110 pico.addComponent(123); 111 pico.addComponent(Foo.class); 112 pico.addComponent(Bar.class); 113 Foo foo = pico.getComponent(Foo.class); 114 assertNotNull(foo.bar); 115 assertNotNull(foo.num); 116 assertEquals("MethodInjector-class org.picocontainer.injectors.MethodInjectionTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 117 } 118 119 public static class Foo2 implements IFoo { 120 private Bar bar; 121 private Integer num; 122 123 public void inject(Bar bar, @Nullable Integer num) { 124 this.bar = bar; 125 this.num = num; 126 } 127 } 128 129 @Test public void testMethodInjectionWithAllowedNullableParam() { 130 DefaultPicoContainer pico = new DefaultPicoContainer(new MethodInjection(), new NullLifecycleStrategy(), new EmptyPicoContainer()); 131 pico.addComponent(Foo2.class); 132 pico.addComponent(Bar.class); 133 Foo2 foo = pico.getComponent(Foo2.class); 134 assertNotNull(foo.bar); 135 assertTrue(foo.num == null); 136 assertEquals("MethodInjector-class org.picocontainer.injectors.MethodInjectionTestCase$Foo2", pico.getComponentAdapter(Foo2.class).toString()); 137 } 138 139 @Test public void testMethodInjectionWithDisallowedNullableParam() { 140 DefaultPicoContainer pico = new DefaultPicoContainer(new MethodInjection()); 141 pico.addComponent(Foo.class); 142 pico.addComponent(Bar.class); 143 try { 144 Foo foo = pico.getComponent(Foo.class); 145 fail("should have barfed"); 146 } catch (SingleMemberInjector.ParameterCannotBeNullException e) { 147 assertEquals("num", e.getParameterName()); 148 assertTrue(e.getMessage().indexOf("Parameter 1") != -1); 149 assertTrue(e.getMessage().indexOf(Foo.class.getMethods()[0].toString()) != -1); 150 } 151 } 152 153 @Test public void testMethodInjectionWithIntegerParamCanBeconvertedFromString() { 154 DefaultPicoContainer pico = new DefaultPicoContainer(new MethodInjection(), new NullLifecycleStrategy(), new EmptyPicoContainer()); 155 pico.as(USE_NAMES).addComponent(Foo.class); 156 pico.addComponent(Bar.class); 157 pico.addComponent("num", "123"); 158 Foo foo = pico.getComponent(Foo.class); 159 assertNotNull(foo.bar); 160 assertNotNull(foo.num); 161 assertEquals(123, (int)foo.num); 162 assertEquals("MethodInjector-class org.picocontainer.injectors.MethodInjectionTestCase$Foo", pico.getComponentAdapter(Foo.class).toString()); 163 } 164 165 }