| /** |
| * 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"); |
| } |
| } |
| } |