001 /***************************************************************************** 002 * Copyright (C) PicoContainer Organization. All rights reserved. * 003 * ------------------------------------------------------------------------- * 004 * The software in this package is published under the terms of the BSD * 005 * style license a copy of which has been included with this distribution in * 006 * the LICENSE.txt file. * 007 * * 008 * Original code by * 009 *****************************************************************************/ 010 package org.picocontainer.defaults; 011 012 import junit.framework.TestCase; 013 import org.picocontainer.Parameter; 014 import org.picocontainer.testmodel.DecoratedTouchable; 015 import org.picocontainer.testmodel.SimpleTouchable; 016 import org.picocontainer.testmodel.Touchable; 017 import org.picocontainer.testmodel.DependsOnTouchable; 018 019 import java.util.Collections; 020 021 /** 022 * @author Thomas Heller 023 * @author Aslak Hellesøy 024 * @version $Revision: 2306 $ 025 */ 026 public class ComponentKeysTestCase extends TestCase { 027 public void testComponensRegisteredWithClassKeyTakePrecedenceOverOthersWhenThereAreMultipleImplementations() throws Exception { 028 DefaultPicoContainer pico = new DefaultPicoContainer(); 029 pico.registerComponentImplementation("default", SimpleTouchable.class); 030 031 /** 032 * By using a class as key, this should take precedence over the other Touchable 033 */ 034 pico.registerComponentImplementation(Touchable.class, DecoratedTouchable.class, new Parameter[]{ 035 new ComponentParameter("default") 036 }); 037 038 Touchable touchable = (Touchable) pico.getComponentInstanceOfType(Touchable.class); 039 assertEquals(DecoratedTouchable.class, touchable.getClass()); 040 } 041 042 public void testComponentAdapterResolutionIsFirstLookedForByClassKeyToTheTopOfTheContainerHierarchy() { 043 DefaultPicoContainer pico = new DefaultPicoContainer(); 044 pico.registerComponentImplementation("default", SimpleTouchable.class); 045 046 // Use the List variant instead, so we get better test coverage. 047 pico.registerComponentImplementation(Touchable.class, DecoratedTouchable.class, Collections.singletonList(new ComponentParameter("default"))); 048 049 DefaultPicoContainer grandChild = new DefaultPicoContainer(new DefaultPicoContainer(new DefaultPicoContainer(pico))); 050 051 Touchable touchable = (Touchable) grandChild.getComponentInstanceOfType(Touchable.class); 052 assertEquals(DecoratedTouchable.class, touchable.getClass()); 053 054 } 055 056 public void testComponentKeysFromParentCannotConfuseTheChild() throws Exception { 057 DefaultPicoContainer pico = new DefaultPicoContainer(); 058 pico.registerComponentImplementation("test", SimpleTouchable.class); 059 060 DefaultPicoContainer child = new DefaultPicoContainer(pico); 061 062 child.registerComponentImplementation("test", DependsOnTouchable.class); 063 064 DependsOnTouchable dot = (DependsOnTouchable) child.getComponentInstance("test"); 065 066 assertNotNull(dot); 067 } 068 069 }