package cucumber.runtime.java.guice.impl; import com.google.inject.Injector; import cucumber.runtime.Env; import cucumber.runtime.java.guice.InjectorSource; import org.junit.Test; import java.util.Properties; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; public class InjectorSourceFactoryTest { private InjectorSourceFactory createInjectorSourceFactory(Properties properties) { return new InjectorSourceFactory(new Env(properties)); } @Test public void createsDefaultInjectorSourceWhenGuiceModulePropertyIsNotSet() throws Exception { InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(new Properties()); assertThat(injectorSourceFactory.create(), is(instanceOf(InjectorSource.class))); } static class CustomInjectorSource implements InjectorSource { @Override public Injector getInjector() { return null; } } @Test public void instantiatesInjectorSourceByFullyQualifiedName() throws Exception { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, CustomInjectorSource.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); assertThat(injectorSourceFactory.create(), is(instanceOf(CustomInjectorSource.class))); } @Test public void failsToInstantiateNonExistantClass() throws Exception { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, "some.bogus.Class"); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); try { injectorSourceFactory.create(); fail(); } catch (InjectorSourceInstantiationFailed exception) { assertThat(exception.getCause(), instanceOf(ClassNotFoundException.class)); } } @Test public void failsToInstantiateClassNotImplementingInjectorSource() throws Exception { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, String.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); try { injectorSourceFactory.create(); fail(); } catch (InjectorSourceInstantiationFailed exception) { assertThat(exception.getCause(), instanceOf(ClassCastException.class)); } } static class PrivateConstructor implements InjectorSource { private PrivateConstructor() { } @Override public Injector getInjector() { return null; } } @Test public void failsToInstantiateClassWithPrivateConstructor() throws Exception { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, PrivateConstructor.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); try { injectorSourceFactory.create(); fail(); } catch (InjectorSourceInstantiationFailed exception) { assertThat(exception.getCause(), instanceOf(IllegalAccessException.class)); } } static class NoDefaultConstructor implements InjectorSource { private NoDefaultConstructor(String someParameter) { } @Override public Injector getInjector() { return null; } } @Test public void failsToInstantiateClassWithNoDefaultConstructor() throws Exception { Properties properties = new Properties(); properties.setProperty(InjectorSourceFactory.GUICE_INJECTOR_SOURCE_KEY, NoDefaultConstructor.class.getName()); InjectorSourceFactory injectorSourceFactory = createInjectorSourceFactory(properties); try { injectorSourceFactory.create(); fail(); } catch (InjectorSourceInstantiationFailed exception) { assertThat(exception.getCause(), instanceOf(InstantiationException.class)); } } }