001 /******************************************************************************* 002 * Copyright (C) PicoContainer Organization. All rights reserved. 003 * --------------------------------------------------------------------------- 004 * The software in this package is published under the terms of the BSD style 005 * license a copy of which has been included with this distribution in the 006 * LICENSE.txt file. 007 ******************************************************************************/ 008 package org.picocontainer.script; 009 010 import static org.junit.Assert.assertNotSame; 011 012 import org.jmock.Expectations; 013 import org.jmock.Mockery; 014 import org.jmock.integration.junit4.JMock; 015 import org.junit.Test; 016 import org.junit.runner.RunWith; 017 import org.picocontainer.DefaultPicoContainer; 018 import org.picocontainer.MutablePicoContainer; 019 import org.picocontainer.PicoContainer; 020 import org.picocontainer.Startable; 021 import org.picocontainer.tck.MockFactory; 022 023 /** 024 * @author Aslak Hellesøy 025 * @author Mauro Talevi 026 */ 027 @RunWith(JMock.class) 028 public class LifecycleContainerBuilderTestCase { 029 030 private Mockery mockery = MockFactory.mockeryWithCountingNamingScheme(); 031 032 @Test 033 public void testBuildContainerCreatesANewChildContainerAndStartsItButNotTheParent() { 034 final Startable childStartable = mockery.mock(Startable.class); 035 mockery.checking(new Expectations() { 036 { 037 one(childStartable).start(); 038 one(childStartable).stop(); 039 } 040 }); 041 042 AbstractContainerBuilder builder = new LifecycleContainerBuilder(childStartable); 043 044 MutablePicoContainer parent = new DefaultPicoContainer(); 045 046 final Startable parentStartable = mockery.mock(Startable.class); 047 parent.addComponent(parentStartable); 048 049 PicoContainer childContainer = builder.buildContainer(parent, null, true); 050 // PicoContainer.getParent() is now ImmutablePicoContainer 051 assertNotSame(parent, childContainer.getParent()); 052 053 builder.killContainer(childContainer); 054 } 055 056 static class LifecycleContainerBuilder extends DefaultContainerBuilder { 057 058 private final Startable childStartable; 059 060 public LifecycleContainerBuilder(Startable childStartable) { 061 this.childStartable = childStartable; 062 } 063 064 @Override 065 protected MutablePicoContainer createContainer(PicoContainer parentContainer, Object assemblyScope) { 066 MutablePicoContainer container = (MutablePicoContainer) super.createContainer(parentContainer, assemblyScope); 067 container.addComponent(childStartable); 068 return container; 069 } 070 071 } 072 }