001    package org.picocontainer.defaults.issues;
002    
003    import org.jmock.MockObjectTestCase;
004    import org.jmock.Mock;
005    import org.picocontainer.ComponentMonitor;
006    import org.picocontainer.Startable;
007    import org.picocontainer.defaults.DefaultPicoContainerTestCase;
008    import org.picocontainer.defaults.DefaultPicoContainer;
009    
010    import java.lang.reflect.Method;
011    
012    public class Issue0265TestCase extends MockObjectTestCase {
013    
014        public void testCanReallyChangeMonitor() throws SecurityException, NoSuchMethodException {
015            Method start = Startable.class.getMethod("start", null);
016            Method stop = Startable.class.getMethod("stop", null);
017            Mock mockMonitor1 = mock(ComponentMonitor.class, "Monitor1");
018            Mock mockMonitor2 = mock(ComponentMonitor.class, "Monitor2");
019            DefaultPicoContainer pico = new DefaultPicoContainer((ComponentMonitor) mockMonitor1.proxy());
020            pico.registerComponentImplementation(DefaultPicoContainerTestCase.MyStartable.class);
021            mockMonitor1.expects(once()).method("instantiating");
022            mockMonitor1.expects(once()).method("instantiated");
023            mockMonitor1.expects(once()).method("invoking").with(eq(start), ANYTHING);
024            mockMonitor1.expects(once()).method("invoked").with(eq(start), ANYTHING, ANYTHING);
025            mockMonitor1.expects(once()).method("invoking").with(eq(stop), ANYTHING);
026            mockMonitor1.expects(once()).method("invoked").with(eq(stop), ANYTHING, ANYTHING);
027            pico.start();
028            pico.stop();
029            Startable startable = (Startable) pico.getComponentInstance(DefaultPicoContainerTestCase.MyStartable.class);
030            assertNotNull(startable);
031            pico.changeMonitor((ComponentMonitor) mockMonitor2.proxy());
032            mockMonitor2.expects(once()).method("invoking").with(eq(start), ANYTHING);
033            mockMonitor2.expects(once()).method("invoked").with(eq(start), ANYTHING, ANYTHING);
034            mockMonitor2.expects(once()).method("invoking").with(eq(stop), ANYTHING);
035            mockMonitor2.expects(once()).method("invoked").with(eq(stop), ANYTHING, ANYTHING);
036            pico.start();
037            pico.stop();
038        }
039    
040    }