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], new NullComponentMonitor(), false);
042 ctor = HashMap.class.getConstructor();
043 }
044
045 @Test public void testCaughtIllegalAccessExceptionInvokesMonitorAndThrows() {
046 final EmptyPicoContainer epc = new EmptyPicoContainer();
047 final IllegalAccessException iae = new IllegalAccessException("foo");
048 NullComponentMonitor ncm = new NullComponentMonitor() {
049 public void instantiationFailed(PicoContainer container,
050 ComponentAdapter componentAdapter,
051 Constructor constructor,
052 Exception e) {
053 assertSame(epc, container);
054 assertSame(ai, componentAdapter);
055 assertSame(ctor, constructor);
056 assertSame(iae, e);
057 }
058 };
059 try {
060 ai.caughtIllegalAccessException(ncm, ctor, iae, epc);
061 } catch (PicoCompositionException e) {
062 assertSame(iae, e.getCause());
063 }
064 }
065
066 @Test public void testCaughtInstantiationExceptionInvokesMonitorAndThrows() {
067 final EmptyPicoContainer epc = new EmptyPicoContainer();
068 final InstantiationException ie = new InstantiationException("foo");
069 NullComponentMonitor ncm = new NullComponentMonitor() {
070 public void instantiationFailed(PicoContainer container,
071 ComponentAdapter componentAdapter,
072 Constructor constructor,
073 Exception e) {
074 assertSame(epc, container);
075 assertSame(ai, componentAdapter);
076 assertSame(ctor, constructor);
077 assertSame(ie, e);
078 }
079 };
080 try {
081 ai.caughtInstantiationException(ncm, ctor, ie, epc);
082 } catch (PicoCompositionException e) {
083 assertSame("Should never get here", e.getMessage());
084 }
085 }
086
087 @Test public void testCaughtInvocationTargetExceptionInvokesMonitorAndReThrowsRuntimeIfRuntimeInTheFirstPlace() {
088 final InvocationTargetException ite = new InvocationTargetException(new RuntimeException("foo"));
089 NullComponentMonitor ncm = new NullComponentMonitor() {
090 public void invocationFailed(Member member, Object instance, Exception e) {
091 assertSame(ctor, member);
092 assertSame("bar", instance);
093 assertSame(ite, e);
094 }
095 };
096 try {
097 ai.caughtInvocationTargetException(ncm, ctor, "bar", ite);
098 } catch (RuntimeException e) {
099 assertSame("foo", e.getMessage());
100 }
101 }
102
103 @Test public void testCaughtInvocationTargetExceptionInvokesMonitorAndReThrowsErrorIfErrorInTheFirstPlace() {
104 final InvocationTargetException ite = new InvocationTargetException(new Error("foo"));
105 NullComponentMonitor ncm = new NullComponentMonitor() {
106 public void invocationFailed(Member member, Object instance, Exception e) {
107 assertSame(ctor, member);
108 assertSame("bar", instance);
109 assertSame(ite, e);
110 }
111 };
112 try {
113 ai.caughtInvocationTargetException(ncm, ctor, "bar", ite);
114 } catch (Error e) {
115 assertSame("foo", e.getMessage());
116 }
117 }
118
119 @Test public void testCaughtInvocationTargetExceptionInvokesMonitorAndReThrowsAsCompositionIfNotRuntimeOrError() {
120 final InvocationTargetException ite = new InvocationTargetException(new Exception("foo"));
121 NullComponentMonitor ncm = new NullComponentMonitor() {
122 public void invocationFailed(Member member, Object instance, Exception e) {
123 assertSame(ctor, member);
124 assertSame("bar", instance);
125 assertSame(ite, e);
126 }
127 };
128 try {
129 ai.caughtInvocationTargetException(ncm, ctor, "bar", ite);
130 } catch (PicoCompositionException e) {
131 assertSame("foo", e.getCause().getMessage());
132 }
133 }
134
135
136
137 private static class MyAbstractInjector extends AbstractInjector {
138
139 public MyAbstractInjector(Object componentKey,
140 Class componentImplementation,
141 Parameter[] parameters,
142 ComponentMonitor monitor,
143 boolean useNames) {
144 super(componentKey, componentImplementation, parameters, monitor, useNames);
145 }
146
147 @Override
148 public void verify(PicoContainer container) throws PicoCompositionException {
149 }
150
151 public Object getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
152 return null;
153 }
154
155 public String getDescriptor() {
156 return null;
157 }
158 }
159 }