001package org.picocontainer.defaults.issues;
002
003import org.junit.Test;import static org.junit.Assert.assertFalse;import static org.junit.Assert.assertEquals;
004import static org.junit.Assert.assertNotNull;
005import org.picocontainer.Startable;
006import org.picocontainer.DefaultPicoContainer;
007import org.picocontainer.ComponentAdapter;
008import org.picocontainer.Characteristics;
009import org.picocontainer.PicoException;
010import org.picocontainer.PicoCompositionException;
011import org.picocontainer.injectors.SetterInjection;
012import org.picocontainer.injectors.Provider;
013import org.picocontainer.injectors.ProviderAdapter;
014import org.picocontainer.behaviors.Cached;
015
016import java.util.List;
017
018public class Issue0357TestCase {
019    
020    public static class SimpleFoo {
021                public SimpleFoo() throws Exception {
022                        throw new Exception("deliberate");
023                }
024        }
025
026        public static class SimpleProvider implements Provider {
027                public SimpleFoo provide() throws Exception {
028                        return new SimpleFoo();
029                }
030        }
031
032        @Test(expected = PicoCompositionException.class)
033        // this method should throw an exception, but silently returns null (the issue)
034        public void testShouldThrowWhenProvideMethodThrowsForCheckedException() {
035                DefaultPicoContainer cont = new DefaultPicoContainer();
036                cont.addAdapter(new ProviderAdapter(new SimpleProvider()));
037                assertNotNull(cont.getComponent(SimpleFoo.class));
038        }
039
040        @Test(expected = PicoCompositionException.class)
041        public void testShouldThrowWhenConstructorThrowsForCheckedException() {
042                DefaultPicoContainer cont = new DefaultPicoContainer();
043                cont.addComponent(SimpleFoo.class);
044                assertNotNull(cont.getComponent(SimpleFoo.class));
045        }
046
047        public static class SimpleFooRuntime {
048                public SimpleFooRuntime() {
049                        throw new RuntimeException("deliberate");
050                }
051        }
052
053        public static class SimpleProviderRuntime implements Provider {
054                public SimpleFooRuntime provide() {
055                        return new SimpleFooRuntime();
056                }
057        }
058
059        @Test(expected = RuntimeException.class)
060        public void testShouldThrowWhenProvideMethodThrowsForRuntimeException() {
061                DefaultPicoContainer cont = new DefaultPicoContainer();
062                cont.addAdapter(new ProviderAdapter(new SimpleProviderRuntime()));
063                assertNotNull(cont.getComponent(SimpleFooRuntime.class));
064        }
065
066}