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