• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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