001 package org.picocontainer.defaults; 002 003 import org.jmock.Mock; 004 import org.jmock.MockObjectTestCase; 005 import org.picocontainer.ComponentAdapter; 006 import org.picocontainer.ComponentMonitor; 007 import org.picocontainer.LifecycleManager; 008 import org.picocontainer.PicoContainer; 009 import org.picocontainer.PicoIntrospectionException; 010 import org.picocontainer.testmodel.SimpleTouchable; 011 import org.picocontainer.testmodel.Touchable; 012 013 /** 014 * @author Mauro Talevi 015 * @version $Revision: 2200 $ 016 */ 017 public class DecoratingComponentAdapterTestCase extends MockObjectTestCase { 018 019 public void testDecoratingComponentAdapterDelegatesToMonitorThatDoesSupportStrategy() { 020 DecoratingComponentAdapter adapter = new DecoratingComponentAdapter(mockComponentAdapterThatDoesSupportStrategy()); 021 adapter.changeMonitor(mockMonitorWithNoExpectedMethods()); 022 assertNotNull(adapter.currentMonitor()); 023 } 024 025 public void testDecoratingComponentAdapterDelegatesToMonitorThatDoesNotSupportStrategy() { 026 DecoratingComponentAdapter adapter = new DecoratingComponentAdapter(mockComponentAdapter()); 027 adapter.changeMonitor(mockMonitorWithNoExpectedMethods()); 028 try { 029 adapter.currentMonitor(); 030 fail("PicoIntrospectionException expected"); 031 } catch (PicoIntrospectionException e) { 032 assertEquals("No component monitor found in delegate", e.getMessage()); 033 } 034 } 035 036 public void testDecoratingComponentAdapterDelegatesLifecycleManagement() { 037 DecoratingComponentAdapter adapter = new DecoratingComponentAdapter(mockComponentAdapterThatCanManageLifecycle()); 038 PicoContainer pico = new DefaultPicoContainer(); 039 adapter.start(pico); 040 adapter.stop(pico); 041 adapter.dispose(pico); 042 Touchable touchable = new SimpleTouchable(); 043 adapter.start(touchable); 044 adapter.stop(touchable); 045 adapter.dispose(touchable); 046 } 047 048 public void testDecoratingComponentAdapterIgnoresLifecycleManagementIfDelegateDoesNotSupportIt() { 049 DecoratingComponentAdapter adapter = new DecoratingComponentAdapter(mockComponentAdapter()); 050 PicoContainer pico = new DefaultPicoContainer(); 051 adapter.start(pico); 052 adapter.stop(pico); 053 adapter.dispose(pico); 054 Touchable touchable = new SimpleTouchable(); 055 adapter.start(touchable); 056 adapter.stop(touchable); 057 adapter.dispose(touchable); 058 } 059 060 ComponentMonitor mockMonitorWithNoExpectedMethods() { 061 Mock mock = mock(ComponentMonitor.class); 062 return (ComponentMonitor)mock.proxy(); 063 } 064 065 private ComponentAdapter mockComponentAdapterThatDoesSupportStrategy() { 066 Mock mock = mock(ComponentAdapterThatSupportsStrategy.class); 067 mock.expects(once()).method("changeMonitor").withAnyArguments(); 068 mock.expects(once()).method("currentMonitor").will(returnValue(mockMonitorWithNoExpectedMethods())); 069 return (ComponentAdapter)mock.proxy(); 070 } 071 072 private ComponentAdapter mockComponentAdapter() { 073 Mock mock = mock(ComponentAdapter.class); 074 return (ComponentAdapter)mock.proxy(); 075 } 076 077 static interface ComponentAdapterThatSupportsStrategy extends ComponentAdapter, ComponentMonitorStrategy { 078 } 079 080 private ComponentAdapter mockComponentAdapterThatCanManageLifecycle() { 081 Mock mock = mock(ComponentAdapterThatCanManageLifecycle.class); 082 mock.expects(once()).method("start").with(isA(PicoContainer.class)); 083 mock.expects(once()).method("stop").with(isA(PicoContainer.class)); 084 mock.expects(once()).method("dispose").with(isA(PicoContainer.class)); 085 mock.expects(once()).method("start").with(isA(Touchable.class)); 086 mock.expects(once()).method("stop").with(isA(Touchable.class)); 087 mock.expects(once()).method("dispose").with(isA(Touchable.class)); 088 return (ComponentAdapter)mock.proxy(); 089 } 090 091 static interface ComponentAdapterThatCanManageLifecycle extends ComponentAdapter, LifecycleManager, LifecycleStrategy { 092 } 093 }