001 package org.picocontainer.injectors;
002
003 import org.junit.Test;
004 import org.picocontainer.DefaultPicoContainer;
005 import org.picocontainer.Parameter;
006 import org.picocontainer.monitors.NullComponentMonitor;
007
008 import static junit.framework.Assert.fail;
009 import static junit.framework.Assert.assertNull;
010 import static org.junit.Assert.assertEquals;
011 import static org.junit.Assert.assertNotNull;
012
013 public class NamedMethodInjectorTestCase {
014
015 public static class Windmill {
016 private String wind;
017 public void setWind(String eeeeee) { // it is important to note here that 'eeeee' is not going to match any named comp
018 this.wind = eeeeee;
019 }
020 }
021
022 @Test
023 public void shouldMatchBasedOnMethodNameIfComponentAvailableAndNonOptional() {
024 final String expected = "use this one pico, its key matched the method name (ish)";
025 NamedMethodInjector nmi = new NamedMethodInjector(Windmill.class, Windmill.class, Parameter.DEFAULT,
026 new NullComponentMonitor(), false);
027 Windmill windmill = new DefaultPicoContainer()
028 .addAdapter(nmi)
029 .addConfig("attemptToConfusePicoContainer", "ha ha, confused you")
030 .addConfig("wind", expected) // matches setWind(..)
031 .addConfig("woo look here another string", "yup, really fooled you this time")
032 .getComponent(Windmill.class);
033 assertNotNull(windmill);
034 assertNotNull(windmill.wind);
035 assertEquals(expected, windmill.wind);
036 }
037
038 @Test
039 public void shouldBeAmbigiousMultipleComponentAvailableOfRightTypeWithoutMatchingName() {
040 NamedMethodInjector nmi = new NamedMethodInjector(Windmill.class, Windmill.class, Parameter.DEFAULT,
041 new NullComponentMonitor());
042 try {
043 new DefaultPicoContainer()
044 .addAdapter(nmi)
045 .addConfig("attemptToConfusePicoContainer", "ha ha, confused you")
046 .addConfig("woo look here another", "yup, really fooled you this time")
047 .getComponent(Windmill.class);
048 fail("should have barfed");
049 } catch (AbstractInjector.AmbiguousComponentResolutionException e) {
050 // expected
051 }
052 }
053
054 @Test
055 public void shouldBeUnsatisfiedIfNoComponentAvailableOfTheRightTypeAndNonOptional() {
056 NamedMethodInjector nmi = new NamedMethodInjector(Windmill.class, Windmill.class, Parameter.DEFAULT,
057 new NullComponentMonitor(), false);
058 try {
059 new DefaultPicoContainer()
060 .addAdapter(nmi)
061 .addConfig("attemptToConfusePicoContainer", 123)
062 .addConfig("woo look here another", 456)
063 .getComponent(Windmill.class);
064 fail("should have barfed");
065 } catch (AbstractInjector.UnsatisfiableDependenciesException e) {
066 // expected
067 }
068 }
069
070 @Test
071 public void withoutNameMatchWillBeOKTooIfOnlyOneOfRightTypeAndNonOptional() {
072 NamedMethodInjector nmi = new NamedMethodInjector(Windmill.class, Windmill.class, Parameter.DEFAULT,
073 new NullComponentMonitor(), false);
074 Windmill windmill = new DefaultPicoContainer()
075 .addAdapter(nmi)
076 .addConfig("anything", "hello")
077 .getComponent(Windmill.class);
078 assertNotNull(windmill);
079 assertNotNull(windmill.wind);
080 assertEquals("hello", windmill.wind);
081 }
082
083 @Test
084 public void withoutNameMatchWillBeOKTooIfNoneOfRightTypeAndOptional() {
085 NamedMethodInjector nmi = new NamedMethodInjector(Windmill.class, Windmill.class, Parameter.DEFAULT,
086 new NullComponentMonitor(), true);
087 Windmill windmill = new DefaultPicoContainer()
088 .addAdapter(nmi)
089 .getComponent(Windmill.class);
090 assertNotNull(windmill);
091 assertNull(windmill.wind);
092 }
093
094 }