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.assertSame;
013    
014    import java.lang.reflect.Constructor;
015    import java.lang.reflect.InvocationTargetException;
016    import java.lang.reflect.Member;
017    import java.lang.reflect.Type;
018    import java.util.HashMap;
019    import java.util.Map;
020    
021    import org.junit.Before;
022    import org.junit.Test;
023    import org.picocontainer.ComponentAdapter;
024    import org.picocontainer.ComponentMonitor;
025    import org.picocontainer.LifecycleStrategy;
026    import org.picocontainer.Parameter;
027    import org.picocontainer.PicoCompositionException;
028    import org.picocontainer.PicoContainer;
029    import org.picocontainer.containers.EmptyPicoContainer;
030    import org.picocontainer.lifecycle.NullLifecycleStrategy;
031    import org.picocontainer.monitors.NullComponentMonitor;
032    
033    @SuppressWarnings("serial")
034    public class AbstractInjectorTestCase {
035    
036        private AbstractInjector ai;
037        Constructor<HashMap> ctor;
038    
039        @Before
040        public void setUp() throws NoSuchMethodException {
041            ai = new MyAbstractInjector(Map.class, HashMap.class, new Parameter[0],
042                                                         new NullComponentMonitor(),
043                                                         new NullLifecycleStrategy(), false);
044            ctor = HashMap.class.getConstructor();
045        }
046    
047        @Test public void testCaughtIllegalAccessExceptionInvokesMonitorAndThrows() {
048            final EmptyPicoContainer epc = new EmptyPicoContainer();
049            final IllegalAccessException iae = new IllegalAccessException("foo");
050            NullComponentMonitor ncm = new NullComponentMonitor() {
051                public void instantiationFailed(PicoContainer container,
052                                                ComponentAdapter componentAdapter,
053                                                Constructor constructor,
054                                                Exception e) {
055                    assertSame(epc, container);
056                    assertSame(ai, componentAdapter);
057                    assertSame(ctor, constructor);
058                    assertSame(iae, e);
059                }
060            };
061            try {
062                ai.caughtIllegalAccessException(ncm, ctor, iae, epc);
063            } catch (PicoCompositionException e) {
064                assertSame(iae, e.getCause());
065            }
066        }
067    
068        @Test public void testCaughtInstantiationExceptionInvokesMonitorAndThrows() {
069            final EmptyPicoContainer epc = new EmptyPicoContainer();
070            final InstantiationException ie = new InstantiationException("foo");
071            NullComponentMonitor ncm = new NullComponentMonitor() {
072                public void instantiationFailed(PicoContainer container,
073                                                ComponentAdapter componentAdapter,
074                                                Constructor constructor,
075                                                Exception e) {
076                    assertSame(epc, container);
077                    assertSame(ai, componentAdapter);
078                    assertSame(ctor, constructor);
079                    assertSame(ie, e);
080                }
081            };
082            try {
083                ai.caughtInstantiationException(ncm, ctor, ie, epc);
084            } catch (PicoCompositionException e) {
085                assertSame("Should never get here", e.getMessage());
086            }
087        }
088    
089        @Test public void testCaughtInvocationTargetExceptionInvokesMonitorAndReThrowsRuntimeIfRuntimeInTheFirstPlace() {
090            final InvocationTargetException ite = new InvocationTargetException(new RuntimeException("foo"));
091            NullComponentMonitor ncm = new NullComponentMonitor() {
092                public void invocationFailed(Member member, Object instance, Exception e) {
093                    assertSame(ctor, member);
094                    assertSame("bar", instance);
095                    assertSame(ite, e);
096                }
097            };
098            try {
099                ai.caughtInvocationTargetException(ncm, ctor, "bar", ite);
100            } catch (RuntimeException e) {
101                assertSame("foo", e.getMessage());
102            }
103        }
104    
105        @Test public void testCaughtInvocationTargetExceptionInvokesMonitorAndReThrowsErrorIfErrorInTheFirstPlace() {
106            final InvocationTargetException ite = new InvocationTargetException(new Error("foo"));
107            NullComponentMonitor ncm = new NullComponentMonitor() {
108                public void invocationFailed(Member member, Object instance, Exception e) {
109                    assertSame(ctor, member);
110                    assertSame("bar", instance);
111                    assertSame(ite, e);
112                }
113            };
114            try {
115                ai.caughtInvocationTargetException(ncm, ctor, "bar", ite);
116            } catch (Error e) {
117                assertSame("foo", e.getMessage());
118            }
119        }
120    
121        @Test public void testCaughtInvocationTargetExceptionInvokesMonitorAndReThrowsAsCompositionIfNotRuntimeOrError() {
122            final InvocationTargetException ite = new InvocationTargetException(new Exception("foo"));
123            NullComponentMonitor ncm = new NullComponentMonitor() {
124                public void invocationFailed(Member member, Object instance, Exception e) {
125                    assertSame(ctor, member);
126                    assertSame("bar", instance);
127                    assertSame(ite, e);
128                }
129            };
130            try {
131                ai.caughtInvocationTargetException(ncm, ctor, "bar", ite);
132            } catch (PicoCompositionException e) {
133                assertSame("foo", e.getCause().getMessage());
134            }
135        }
136    
137    
138    
139        private static class MyAbstractInjector extends AbstractInjector {
140    
141            public MyAbstractInjector(Object componentKey,
142                                      Class componentImplementation,
143                                      Parameter[] parameters,
144                                      ComponentMonitor monitor,
145                                      LifecycleStrategy lifecycleStrategy,
146                                      boolean useNames) {
147                super(componentKey, componentImplementation, parameters, monitor, lifecycleStrategy, useNames);
148            }
149    
150            @Override
151            public void verify(PicoContainer container) throws PicoCompositionException {
152                    }
153    
154            public Object getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
155                return null;
156            }
157    
158            public void decorateComponentInstance(PicoContainer container, Type into, Object instance) {
159            }
160    
161            public String getDescriptor() {
162                return null;
163            }
164        }
165    }