blob: f30cb27bad934cc2036fcd987528af1882855813 [file] [log] [blame]
/**
* Copyright (C) 2006 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.inject;
import static com.google.inject.Asserts.assertContains;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import junit.framework.TestCase;
/**
* @author crazybob@google.com (Bob Lee)
*/
public class RequestInjectionTest extends TestCase {
@Retention(RUNTIME)
@BindingAnnotation @interface ForField {}
@Retention(RUNTIME)
@BindingAnnotation @interface ForMethod {}
protected void setUp() throws Exception {
super.setUp();
HasInjections.staticField = 0;
HasInjections.staticMethod = null;
}
public void testInjectMembers() {
final HasInjections hi = new HasInjections();
Guice.createInjector(new AbstractModule() {
protected void configure() {
bindConstant().annotatedWith(ForMethod.class).to("test");
bindConstant().annotatedWith(ForField.class).to(5);
requestInjection(hi);
}
});
assertEquals("test", hi.instanceMethod);
assertEquals(5, hi.instanceField);
assertNull(HasInjections.staticMethod);
assertEquals(0, HasInjections.staticField);
}
public void testInjectStatics() throws CreationException {
Guice.createInjector(new AbstractModule() {
protected void configure() {
bindConstant().annotatedWith(ForMethod.class).to("test");
bindConstant().annotatedWith(ForField.class).to(5);
requestStaticInjection(HasInjections.class);
}
});
assertEquals("test", HasInjections.staticMethod);
assertEquals(5, HasInjections.staticField);
}
public void testInjectMembersAndStatics() {
final HasInjections hi = new HasInjections();
Guice.createInjector(new AbstractModule() {
protected void configure() {
bindConstant().annotatedWith(ForMethod.class).to("test");
bindConstant().annotatedWith(ForField.class).to(5);
requestStaticInjection(HasInjections.class);
requestInjection(hi);
}
});
assertEquals("test", hi.instanceMethod);
assertEquals(5, hi.instanceField);
assertEquals("test", HasInjections.staticMethod);
assertEquals(5, HasInjections.staticField);
}
public void testValidationErrorOnInjectedMembers() {
try {
Guice.createInjector(new AbstractModule() {
protected void configure() {
requestInjection(new NeedsRunnable());
}
});
} catch (CreationException expected) {
assertContains(expected.getMessage(),
"1) No implementation for java.lang.Runnable was bound",
"at " + NeedsRunnable.class.getName(), ".runnable(RequestInjectionTest.java:");
}
}
public void testInjectionErrorOnInjectedMembers() {
try {
Guice.createInjector(new AbstractModule() {
protected void configure() {
bind(Runnable.class).toProvider(new Provider<Runnable>() {
public Runnable get() {
throw new UnsupportedOperationException();
}
});
requestInjection(new NeedsRunnable());
}
});
} catch (CreationException expected) {
assertContains(expected.getMessage(),
"1) Error in custom provider, java.lang.UnsupportedOperationException",
"for field at " + NeedsRunnable.class.getName() + ".runnable(RequestInjectionTest.java:",
"at " + getClass().getName(), ".configure(RequestInjectionTest.java:");
}
}
public void testUserExceptionWhileInjectingInstance() {
try {
Guice.createInjector(new AbstractModule() {
protected void configure() {
requestInjection(new BlowsUpOnInject());
}
});
fail();
} catch (CreationException expected) {
assertContains(expected.getMessage(),
"1) Error injecting method, java.lang.UnsupportedOperationException: Pop",
"at " + BlowsUpOnInject.class.getName() + ".injectInstance(RequestInjectionTest.java:");
}
}
public void testUserExceptionWhileInjectingStatically() {
try {
Guice.createInjector(new AbstractModule() {
protected void configure() {
requestStaticInjection(BlowsUpOnInject.class);
}
});
fail();
} catch (CreationException expected) {
assertContains(expected.getMessage(),
"1) Error injecting method, java.lang.UnsupportedOperationException: Snap",
"at " + BlowsUpOnInject.class.getName() + ".injectStatically(RequestInjectionTest.java:");
}
}
static class NeedsRunnable {
@Inject Runnable runnable;
}
static class HasInjections {
@Inject @ForField static int staticField;
@Inject @ForField int instanceField;
static String staticMethod;
String instanceMethod;
@Inject static void setStaticMethod(@ForMethod String staticMethod) {
HasInjections.staticMethod = staticMethod;
}
@Inject void setInstanceS(@ForMethod String instanceS) {
this.instanceMethod = instanceS;
}
}
static class BlowsUpOnInject {
@Inject void injectInstance() {
throw new UnsupportedOperationException("Pop");
}
@Inject static void injectStatically() {
throw new UnsupportedOperationException("Snap");
}
}
}