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 static org.junit.Assert.assertEquals; 013 import static org.junit.Assert.assertNotNull; 014 015 import org.junit.Test; 016 import org.picocontainer.DefaultPicoContainer; 017 import org.picocontainer.parameters.ComponentParameter; 018 import org.picocontainer.testmodel.DecoratedTouchable; 019 import org.picocontainer.testmodel.DependsOnTouchable; 020 import org.picocontainer.testmodel.SimpleTouchable; 021 import org.picocontainer.testmodel.Touchable; 022 023 /** 024 * @author Thomas Heller 025 * @author Aslak Hellesøy 026 */ 027 public class ComponentKeysTestCase { 028 029 @Test public void testComponensRegisteredWithClassKeyTakePrecedenceOverOthersWhenThereAreMultipleImplementations() throws Exception { 030 DefaultPicoContainer pico = new DefaultPicoContainer(); 031 pico.addComponent("default", SimpleTouchable.class); 032 033 /** 034 * By using a class as key, this should take precedence over the other Touchable 035 */ 036 pico.addComponent(Touchable.class, DecoratedTouchable.class, new ComponentParameter("default")); 037 038 Touchable touchable = pico.getComponent(Touchable.class); 039 assertEquals(DecoratedTouchable.class, touchable.getClass()); 040 } 041 042 @Test public void testComponentAdapterResolutionIsFirstLookedForByClassKeyToTheTopOfTheContainerHierarchy() { 043 DefaultPicoContainer pico = new DefaultPicoContainer(); 044 pico.addComponent("default", SimpleTouchable.class); 045 046 // Use the List variant instead, so we get better test coverage. 047 pico.addComponent(Touchable.class, DecoratedTouchable.class, new ComponentParameter("default")); 048 049 DefaultPicoContainer grandChild = new DefaultPicoContainer(new DefaultPicoContainer(new DefaultPicoContainer(pico))); 050 051 Touchable touchable = grandChild.getComponent(Touchable.class); 052 assertEquals(DecoratedTouchable.class, touchable.getClass()); 053 054 } 055 056 @Test public void testComponentKeysFromParentCannotConfuseTheChild() throws Exception { 057 DefaultPicoContainer pico = new DefaultPicoContainer(); 058 pico.addComponent("test", SimpleTouchable.class); 059 060 DefaultPicoContainer child = new DefaultPicoContainer(pico); 061 062 child.addComponent("test", DependsOnTouchable.class); 063 064 DependsOnTouchable dot = (DependsOnTouchable) child.getComponent("test"); 065 066 assertNotNull(dot); 067 } 068 069 }