001    package org.picocontainer.defaults.issues;
002    
003    import org.junit.Test;import static org.junit.Assert.assertFalse;import static org.junit.Assert.assertEquals;
004    import static org.junit.Assert.assertNotNull;
005    import org.picocontainer.Startable;
006    import org.picocontainer.DefaultPicoContainer;
007    import org.picocontainer.ComponentAdapter;
008    import org.picocontainer.Characteristics;
009    import org.picocontainer.PicoException;
010    import org.picocontainer.PicoCompositionException;
011    import org.picocontainer.injectors.SetterInjection;
012    import org.picocontainer.injectors.Provider;
013    import org.picocontainer.injectors.ProviderAdapter;
014    import org.picocontainer.behaviors.Cached;
015    
016    import java.util.List;
017    
018    public 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    }