A couple of test changes:
- to ensure that lookups are valid by the time InjectionListener.hear() is called
- to ensure that classes with no @Inject-annotated members still fire the injectable type listener. This test is currently failing.
git-svn-id: https://google-guice.googlecode.com/svn/trunk@923 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/test/com/google/inject/InjectableTypeListenerTest.java b/test/com/google/inject/InjectableTypeListenerTest.java
index 9c5e831..d420b31 100644
--- a/test/com/google/inject/InjectableTypeListenerTest.java
+++ b/test/com/google/inject/InjectableTypeListenerTest.java
@@ -350,6 +350,16 @@
final AtomicReference<MembersInjector<A>> aMembersInjectorReference
= new AtomicReference<MembersInjector<A>>();
+ final InjectionListener<Object> lookupsTester = new InjectionListener<Object>() {
+ public void afterInjection(Object injectee) {
+ assertNotNull(bProviderReference.get().get());
+
+ A a = new A();
+ aMembersInjectorReference.get().injectMembers(a);
+ assertNotNull(a.injector);
+ }
+ };
+
Guice.createInjector(new AbstractModule() {
protected void configure() {
bindListener(only(TypeLiteral.get(C.class)), new InjectableType.Listener() {
@@ -374,18 +384,17 @@
expected.getMessage());
}
aMembersInjectorReference.set(aMembersInjector);
+
+ encounter.register(lookupsTester);
}
});
- bind(C.class);
+ // this ensures the type listener fires, and also the afterInjection() listener
+ bind(C.class).asEagerSingleton();
}
});
- assertNotNull(bProviderReference.get().get());
-
- A a = new A();
- aMembersInjectorReference.get().injectMembers(a);
- assertNotNull(a.injector);
+ lookupsTester.afterInjection(null);
}
public void testLookupsPostCreate() {
@@ -406,6 +415,29 @@
injector.getInstance(C.class);
}
+ /**
+ * We had a bug where we weren't notifying of types encountered for member injection when those
+ * types had no members to be injected. Constructed types are always injected because they always
+ * have at least one injection point: the class constructor.
+ */
+ public void testTypesWithNoInjectableMembersAreNotified() {
+ final AtomicInteger notificationCount = new AtomicInteger();
+
+ Guice.createInjector(new AbstractModule() {
+ protected void configure() {
+ bindListener(any(), new InjectableType.Listener() {
+ public <I> void hear(InjectableType<I> injectableType, Encounter<I> encounter) {
+ notificationCount.incrementAndGet();
+ }
+ });
+
+ bind(C.class).toInstance(new C());
+ }
+ });
+
+ assertEquals(1, notificationCount.get());
+ }
+
// TODO: recursively accessing a lookup should fail
static class A {