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 }