package br.com.caelum.iogi; import java.util.Collections; import java.util.List; import org.jmock.Expectations; import org.jmock.Mockery; import org.junit.After; import org.junit.Before; import org.junit.Test; import br.com.caelum.iogi.exceptions.InvalidTypeException; import br.com.caelum.iogi.parameters.Parameters; import br.com.caelum.iogi.reflection.Target; public class MultiInstantiatorTests { private final Mockery context = new Mockery(); private Instantiator<?> mockSubInstantiator; private List<Instantiator<?>> theMockInstantiator; @Before public void setUp() { this.mockSubInstantiator = context.mock(Instantiator.class); theMockInstantiator = Collections.<Instantiator<?>>singletonList(mockSubInstantiator); } @After public void tearDown() { context.assertIsSatisfied(); } @Test public void multiInstantiatorWillUseAnAbleInstantiator() throws Exception { final MultiInstantiator multiInstantiator = new MultiInstantiator(theMockInstantiator); context.checking(new Expectations() {{ allowing(mockSubInstantiator).isAbleToInstantiate(with(any(Target.class))); will(returnValue(true)); one(mockSubInstantiator).instantiate(with(any(Target.class)), (with(any(Parameters.class)))); }}); multiInstantiator.instantiate(Target.create(Object.class, ""), null); } @Test(expected=InvalidTypeException.class) public void ifNoAbleInstantiatorIsFoundWillThrowAnException() { final MultiInstantiator mutliInstantiator = new MultiInstantiator(theMockInstantiator); context.checking(new Expectations() {{ allowing(mockSubInstantiator).isAbleToInstantiate(with(any(Target.class))); will(returnValue(false)); }}); mutliInstantiator.instantiate(Target.create(Object.class, ""), null); } }