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.behaviors; 011 012 013 import static org.junit.Assert.assertEquals; 014 import static org.junit.Assert.fail; 015 016 import org.junit.Test; 017 import org.picocontainer.Characteristics; 018 import org.picocontainer.ComponentAdapter; 019 import org.picocontainer.ComponentFactory; 020 import org.picocontainer.DefaultPicoContainer; 021 import static org.picocontainer.Characteristics.GUARD; 022 import org.picocontainer.adapters.InstanceAdapter; 023 import org.picocontainer.containers.EmptyPicoContainer; 024 import org.picocontainer.injectors.ConstructorInjection; 025 import org.picocontainer.injectors.ConstructorInjector; 026 import org.picocontainer.lifecycle.NullLifecycleStrategy; 027 import org.picocontainer.monitors.NullComponentMonitor; 028 import org.picocontainer.tck.AbstractComponentFactoryTest; 029 030 031 /** 032 * @author Paul Hammant 033 */ 034 public class GuardingTestCase extends AbstractComponentFactoryTest { 035 036 protected ComponentFactory createComponentFactory() { 037 return new Guarding().wrap(new ConstructorInjection()); 038 } 039 040 @Test public void testAddComponentUsesGuardingBehavior() { 041 DefaultPicoContainer pico = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer()); 042 pico.addComponent("guard", MyGuard.class); 043 pico.as(GUARD).addComponent("foo", String.class); 044 ComponentAdapter fooAdapter = pico.getComponentAdapter("foo"); 045 assertEquals(Guarded.class, fooAdapter.getClass()); 046 assertEquals(ConstructorInjector.class, ((AbstractBehavior) fooAdapter).getDelegate().getClass()); 047 try { 048 String foo = (String) pico.getComponent("foo"); 049 fail("should have barfed"); 050 } catch (Exception e) { 051 assertEquals("not so fast", e.getMessage()); 052 } 053 } 054 055 public static class MyGuard { 056 public MyGuard() { 057 throw new RuntimeException("not so fast"); 058 } 059 } 060 061 @Test public void testAddComponentDoesNotUseGuardingBehaviorIfNoProperty() { 062 DefaultPicoContainer pico = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer()); 063 pico.addComponent("guard", MyGuard.class); 064 pico.addComponent("foo", String.class); 065 ComponentAdapter fooAdapter = pico.getComponentAdapter("foo"); 066 assertEquals(ConstructorInjector.class, fooAdapter.getClass()); 067 String foo = (String) pico.getComponent("foo"); 068 } 069 070 @Test public void testAddComponentUsesGuardingBehaviorWithCustomGuardKey() { 071 DefaultPicoContainer pico = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer()); 072 pico.addComponent("my_guard", MyGuard.class); 073 pico.as(GUARD("my_guard")).addComponent("foo", String.class); 074 ComponentAdapter fooAdapter = pico.getComponentAdapter("foo"); 075 assertEquals(Guarded.class, fooAdapter.getClass()); 076 assertEquals(ConstructorInjector.class, fooAdapter.getDelegate().getClass()); 077 try { 078 String foo = (String) pico.getComponent("foo"); 079 fail("should have barfed"); 080 } catch (Exception e) { 081 assertEquals("not so fast", e.getMessage()); 082 } 083 } 084 085 @Test public void testAddComponentUsesGuardingBehaviorByAdapitveDefault() { 086 DefaultPicoContainer pico = new DefaultPicoContainer(new NullLifecycleStrategy(), new EmptyPicoContainer()); 087 pico.addComponent("guard", MyGuard.class); 088 pico.as(GUARD).addComponent("foo", String.class); 089 ComponentAdapter fooAdapter = pico.getComponentAdapter("foo"); 090 assertEquals(Guarded.class, fooAdapter.getClass()); 091 assertEquals(ConstructorInjector.class, fooAdapter.getDelegate().getClass()); 092 try { 093 String foo = (String) pico.getComponent("foo"); 094 fail("should have barfed"); 095 } catch (Exception e) { 096 assertEquals("not so fast", e.getMessage()); 097 } 098 } 099 100 }