001 package org.picocontainer.defaults.issues; 002 003 import org.junit.Test; 004 import org.picocontainer.MutablePicoContainer; 005 import org.picocontainer.PicoBuilder; 006 import org.picocontainer.Characteristics; 007 008 import org.picocontainer.injectors.SetterInjection; 009 import static junit.framework.Assert.assertEquals; 010 011 public class Issue0316TestCase { 012 013 //@Test 014 public void testGood() { 015 doTest(GoodTarget.class); 016 } 017 018 @Test 019 public void testBad() { 020 doTest(BadTarget.class); 021 } 022 023 024 private void doTest(Class targetClass) { 025 MutablePicoContainer pico = new PicoBuilder(new SetterInjection("inject")).build(); 026 pico.addComponent("fruit1", Apple.class); 027 pico.addComponent("fruit2", Pear.class); 028 pico.addComponent(new Integer(42)); 029 pico.as(Characteristics.USE_NAMES).addComponent(targetClass); 030 031 Target target = (Target)pico.getComponent(targetClass); 032 System.out.println("target is " + target.getClass().getName()); 033 assertEquals("apple", target.eat1()); 034 assertEquals("pear", target.eat2()); 035 assertEquals(42, target.getNumber()); 036 } 037 038 039 public static interface Fruit { 040 public String eat(); 041 } 042 public static class Apple implements Fruit { 043 public String eat() { return "apple"; } 044 } 045 public static class Pear implements Fruit { 046 public String eat() { return "pear"; } 047 } 048 049 public static interface Target { 050 String eat1(); 051 String eat2(); 052 int getNumber(); 053 } 054 055 public static class GoodTarget implements Target { 056 private Fruit fruit1; 057 private Fruit fruit2; 058 private Integer number; 059 060 public void injectNumber(Integer number) { 061 this.number = number; 062 } 063 064 public void injectFruit1(Fruit fruit1) { 065 this.fruit1 = fruit1; 066 } 067 068 public void injectFruit2(Fruit fruit2) { 069 this.fruit2 = fruit2; 070 } 071 public int getNumber() { 072 return number.intValue(); 073 } 074 075 public String eat1() { return fruit1.eat(); } 076 public String eat2() { return fruit2.eat(); } 077 } 078 079 public static class BadTarget implements Target { 080 private Fruit fruit1; 081 private Fruit fruit2; 082 private Integer number; 083 084 public void injectFruit1(Fruit fruit1) { 085 this.fruit1 = fruit1; 086 } 087 088 public void injectFruit2(Fruit fruit2) { 089 this.fruit2 = fruit2; 090 } 091 092 public void injectNumber(Integer number) { 093 this.number = number; 094 } 095 096 public int getNumber() { 097 return number.intValue(); 098 } 099 100 public String eat1() { return fruit1.eat(); } 101 public String eat2() { return fruit2.eat(); } 102 } 103 104 }