package com.netflix.governator; import com.google.inject.AbstractModule; import com.google.inject.CreationException; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Stage; import com.netflix.governator.guice.ModulesEx; import com.netflix.governator.guice.annotations.Bootstrap; import org.junit.Assert; import org.junit.Test; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; public class BootstrapTest { public static interface Foo { } public static class Foo1 implements Foo { } public static class Foo2 implements Foo { } @Documented @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Bootstrap(module=FooBootstrap.class) public static @interface FooConfiguration { Class<? extends Foo> foo() default Foo1.class; } public static class FooBootstrap extends AbstractModule { private FooConfiguration config; public FooBootstrap(FooConfiguration config) { this.config = config; } @Override protected void configure() { bind(Foo.class).to(config.foo()); } } @FooConfiguration public static class MyApplication extends AbstractModule { @Override protected void configure() { } } @FooConfiguration public static class MyApplicationWithOverride extends AbstractModule { @Override protected void configure() { bind(Foo.class).to(Foo2.class); } } @Test public void testWithoutOverride() { Injector injector = Guice.createInjector(Stage.DEVELOPMENT, ModulesEx.fromClass(MyApplication.class)); Assert.assertEquals(Foo1.class, injector.getInstance(Foo.class).getClass()); } @Test(expected=CreationException.class) public void testDuplicateWithoutOverride() { Injector injector = Guice.createInjector(Stage.DEVELOPMENT, ModulesEx.fromClass(MyApplicationWithOverride.class, false)); Assert.fail("Should have failed with duplicate binding exception"); } @Test public void testDuplicateWithOverride() { Injector injector = Guice.createInjector(Stage.DEVELOPMENT, ModulesEx.fromClass(MyApplicationWithOverride.class)); Assert.assertEquals(Foo2.class, injector.getInstance(Foo.class).getClass()); } }