Introduction
Suppose you need a factory which gives you one implementation of interface depends on given parameter. The number of possible implementations is quite big. It could be resolved with factory with injected providers of each implementation, but in Guice we have a better way to achieve this goal...Main
We could inject Injector to our class. We have a builder factory which could gives us implementation based on parameter:public class BuilderFactory {
private Injector injector;
@Inject
public BuilderFactory(final Injector injector) {
this.injector = injector;
}
public Builder getBuilder(String param){
if("first".equals(param)){
return injector.getInstance(FirstBuilder.class);
} else if("second".equals(param)){
return injector.getInstance(SecondBuilder.class);
} else {
return injector.getInstance(DefaultBuilder.class);
}
}
}And there are builders:public interface Builder {}
public class FirstBuilder implements Builder{}
public class SecondBuilder implements Builder{}
public class DefaultBuilder implements Builder{}First, to test is simply get injector from injector:
@Test
public void shouldInjectInjectorFromInjector(){
//given
Injector sut = Guice.createInjector();
//when
Injector result = sut.getInstance(Injector.class);
//then
assertEquals(sut, result);
}Now let's get specific builder from our BuilderFactory:
@Test
public void shouldGetFirstBuilderFromFactory(){
//given
Injector sut = Guice.createInjector();
BuilderFactory builderFactory = sut.getInstance(BuilderFactory.class);
//when
Builder builder = builderFactory.getBuilder("first");
//then
assertTrue(builder instanceof FirstBuilder);
}
@Test
public void shouldGetSecondBuilderFromFactory(){
//given
Injector sut = Guice.createInjector();
BuilderFactory builderFactory = sut.getInstance(BuilderFactory.class);
//when
Builder builder = builderFactory.getBuilder("second");
//then
assertTrue(builder instanceof SecondBuilder);
}
@Test
public void shouldGetDefaultBuilderFromFactory(){
//given
Injector sut = Guice.createInjector();
BuilderFactory builderFactory = sut.getInstance(BuilderFactory.class);
//when
Builder builder = builderFactory.getBuilder("unknown");
//then
assertTrue(builder instanceof DefaultBuilder);
}And every tests pass.