| package com.google.inject.spi; |
| |
| import java.util.Map; |
| |
| import com.google.inject.AbstractModule; |
| import com.google.inject.Binding; |
| import com.google.inject.Guice; |
| import com.google.inject.Inject; |
| import com.google.inject.Injector; |
| import com.google.inject.Key; |
| import com.google.inject.Provider; |
| import com.google.inject.TypeLiteral; |
| |
| import junit.framework.TestCase; |
| |
| /** |
| * @author sberlin@gmail.com (Sam Berlin) |
| */ |
| public class InjectorSpiTest extends TestCase { |
| |
| public void testExistingBinding() { |
| Injector injector = Guice.createInjector(new AbstractModule() { |
| @Override |
| protected void configure() { |
| bind(Foo.class); |
| bind(Baz.class); |
| } |
| }); |
| // Sanity check -- ensure we return the proper binding for all existing bindings. |
| for(Map.Entry<Key<?>, Binding<?>> entry : injector.getAllBindings().entrySet()) { |
| assertSame(entry.getValue(), injector.getExistingBinding(entry.getKey())); |
| } |
| |
| // Now run through specifics... |
| Binding<?> binding; |
| |
| // 1) non-Provider Foo.class |
| binding = injector.getExistingBinding(Key.get(Foo.class)); |
| assertNotNull(binding); |
| assertEquals(Foo.class, binding.getKey().getTypeLiteral().getRawType()); |
| |
| // 2) Provider<Foo> class (should already exist, because Baz @Injects it). |
| // the assertTrue is a bit stricter than necessary, but makes sure this works for pre-existing Provider bindings |
| assertTrue(injector.getAllBindings().containsKey(Key.get(new TypeLiteral<Provider<Foo>>() {}))); |
| binding = injector.getExistingBinding(Key.get(new TypeLiteral<Provider<Foo>>() {})); |
| assertNotNull(binding); |
| assertEquals(Provider.class, binding.getKey().getTypeLiteral().getRawType()); |
| assertEquals(Foo.class, ((Provider)binding.getProvider().get()).get().getClass()); |
| |
| // 3) non-Provider Baz.class |
| binding = injector.getExistingBinding(Key.get(Baz.class)); |
| assertNotNull(binding); |
| assertEquals(Baz.class, binding.getKey().getTypeLiteral().getRawType()); |
| |
| // 4) Provider<Baz> class (should not already exist, because nothing used it yet). |
| // the assertFalse is a bit stricter than necessary, but makes sure this works for non-pre-existing Provider bindings |
| assertFalse(injector.getAllBindings().containsKey(Key.get(new TypeLiteral<Provider<Baz>>() {}))); |
| binding = injector.getExistingBinding(Key.get(new TypeLiteral<Provider<Baz>>() {})); |
| assertNotNull(binding); |
| assertEquals(Provider.class, binding.getKey().getTypeLiteral().getRawType()); |
| assertEquals(Baz.class, ((Provider)binding.getProvider().get()).get().getClass()); |
| |
| // 5) non-Provider Bar, doesn't exist. |
| assertNull(injector.getExistingBinding(Key.get(Bar.class))); |
| |
| // 6) Provider Bar, doesn't exist. |
| assertNull(injector.getExistingBinding(Key.get(new TypeLiteral<Provider<Bar>>() {}))); |
| } |
| |
| private static class Foo {} |
| private static class Bar {} |
| private static class Baz { @SuppressWarnings("unused") @Inject Provider<Foo> fooP; } |
| |
| } |