package org.dayatang.ioc.guice; import com.google.inject.*; import com.google.inject.name.Names; import org.dayatang.domain.InstanceProvider; import org.dayatang.ioc.test.*; import org.junit.Test; import java.util.Arrays; import java.util.List; import java.util.Set; import static org.junit.Assert.*; public class GuiceInstanceProviderTest extends AbstractInstanceProviderTest { @Test public void testConstructorFromModule() { assertEquals("I am Service 1", getProvider().getInstance(Service1.class).sayHello()); } @Test public void testConstructorFromInjector() { InstanceProvider provider = new GuiceInstanceProvider(createInjector()); assertEquals("I am Service 1", provider.getInstance(Service1.class).sayHello()); } private Injector createInjector() { return Guice.createInjector(createModule()); } private Module createModule() { return new AbstractModule() { @Override protected void configure() { bind(Service1.class).to(MyService1.class).in(Scopes.SINGLETON); bind(Service2.class).annotatedWith(Names.named("service21")).to(MyService21.class).in(Scopes.SINGLETON); bind(Service2.class).annotatedWith(Names.named("service22")).to(MyService22.class).in(Scopes.SINGLETON); bind(Service3.class).annotatedWith(MyBindingAnnotation.class).to(MyService31.class).in(Scopes.SINGLETON); } }; } @Override protected InstanceProvider createInstanceProvider() { return new GuiceInstanceProvider(createModule()); } @Override @Test public void testGetInstanceWithAnnotation() { Service3 service = getProvider().getInstance(Service3.class, MyBindingAnnotation.class); assertNotNull(service); } @Test public void testGetInstances() { List<Service> expected = Arrays.asList( new MyService1(), new MyService21(), new MyService22(), new MyService31() ); Set<Service> services = getProvider().getInstances(Service.class); assertTrue(services.containsAll(expected)); } }