1 package com.google.inject.spi; 2 3 import com.google.inject.AbstractModule; 4 import com.google.inject.Binding; 5 import com.google.inject.Guice; 6 import com.google.inject.Inject; 7 import com.google.inject.Injector; 8 import com.google.inject.Key; 9 import com.google.inject.Provider; 10 import com.google.inject.TypeLiteral; 11 import java.util.Map; 12 import junit.framework.TestCase; 13 14 /** @author sberlin@gmail.com (Sam Berlin) */ 15 public class InjectorSpiTest extends TestCase { 16 testExistingBinding()17 public void testExistingBinding() { 18 Injector injector = 19 Guice.createInjector( 20 new AbstractModule() { 21 @Override 22 protected void configure() { 23 bind(Foo.class); 24 bind(Baz.class); 25 } 26 }); 27 // Sanity check -- ensure we return the proper binding for all existing bindings. 28 for (Map.Entry<Key<?>, Binding<?>> entry : injector.getAllBindings().entrySet()) { 29 assertSame(entry.getValue(), injector.getExistingBinding(entry.getKey())); 30 } 31 32 // Now run through specifics... 33 Binding<?> binding; 34 35 // 1) non-Provider Foo.class 36 binding = injector.getExistingBinding(Key.get(Foo.class)); 37 assertNotNull(binding); 38 assertEquals(Foo.class, binding.getKey().getTypeLiteral().getRawType()); 39 40 // 2) Provider<Foo> class (should already exist, because Baz @Injects it). 41 // the assertTrue is a bit stricter than necessary, but makes sure this works for pre-existing Provider bindings 42 assertTrue(injector.getAllBindings().containsKey(Key.get(new TypeLiteral<Provider<Foo>>() {}))); 43 binding = injector.getExistingBinding(Key.get(new TypeLiteral<Provider<Foo>>() {})); 44 assertNotNull(binding); 45 assertEquals(Provider.class, binding.getKey().getTypeLiteral().getRawType()); 46 assertEquals(Foo.class, ((Provider) binding.getProvider().get()).get().getClass()); 47 48 // 3) non-Provider Baz.class 49 binding = injector.getExistingBinding(Key.get(Baz.class)); 50 assertNotNull(binding); 51 assertEquals(Baz.class, binding.getKey().getTypeLiteral().getRawType()); 52 53 // 4) Provider<Baz> class (should not already exist, because nothing used it yet). 54 // the assertFalse is a bit stricter than necessary, but makes sure this works for non-pre-existing Provider bindings 55 assertFalse( 56 injector.getAllBindings().containsKey(Key.get(new TypeLiteral<Provider<Baz>>() {}))); 57 binding = injector.getExistingBinding(Key.get(new TypeLiteral<Provider<Baz>>() {})); 58 assertNotNull(binding); 59 assertEquals(Provider.class, binding.getKey().getTypeLiteral().getRawType()); 60 assertEquals(Baz.class, ((Provider) binding.getProvider().get()).get().getClass()); 61 62 // 5) non-Provider Bar, doesn't exist. 63 assertNull(injector.getExistingBinding(Key.get(Bar.class))); 64 65 // 6) Provider Bar, doesn't exist. 66 assertNull(injector.getExistingBinding(Key.get(new TypeLiteral<Provider<Bar>>() {}))); 67 } 68 69 private static class Foo {} 70 71 private static class Bar {} 72 73 private static class Baz { 74 @SuppressWarnings("unused") 75 @Inject 76 Provider<Foo> fooP; 77 } 78 } 79