package com.flextrade.jfixture.builders; import com.flextrade.jfixture.NoSpecimen; import com.flextrade.jfixture.SpecimenContext; import com.flextrade.jfixture.exceptions.ObjectCreationException; import com.flextrade.jfixture.requests.FactoryMethodRequest; import com.flextrade.jfixture.utility.SpecimenType; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import testtypes.factorymethods.TypeWithFactoryMethod; import java.lang.reflect.Method; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; public class TestFactoryMethodRelay { private FactoryMethodRelay relay; @Mock private SpecimenContext mockSpecimenContext; @Before public void initialise() { MockitoAnnotations.initMocks(this); relay = new FactoryMethodRelay(); } @Test public void non_factory_method_request_returns_no_specimen() { Object specimen = this.relay.create(String.class, mockSpecimenContext); assertEquals(new NoSpecimen(), specimen); } @Test(expected = ObjectCreationException.class) public void throws_exception_if_method_parameters_are_invalid() throws NoSuchMethodException { when(mockSpecimenContext.resolve(SpecimenType.of(String.class))).thenReturn(1); when(mockSpecimenContext.resolve(SpecimenType.of(int.class))).thenReturn("string"); this.relay.create(getRequest(), mockSpecimenContext); } @Test public void method_is_invoked_with_parameters_from_specimen_context() throws NoSuchMethodException { when(mockSpecimenContext.resolve(SpecimenType.of(String.class))).thenReturn("string"); when(mockSpecimenContext.resolve(SpecimenType.of(int.class))).thenReturn(1); Object specimen = this.relay.create(getRequest(), mockSpecimenContext); assertTrue(specimen instanceof TypeWithFactoryMethod); assertEquals("string", ((TypeWithFactoryMethod) specimen).getSymbol()); assertEquals(1, ((TypeWithFactoryMethod) specimen).getSize()); } private static Method getFactoryMethod() throws NoSuchMethodException { return TypeWithFactoryMethod.class.getDeclaredMethod("create", String.class, int.class); } private static FactoryMethodRequest getRequest() throws NoSuchMethodException { return new FactoryMethodRequest(getFactoryMethod(), SpecimenType.of(TypeWithFactoryMethod.class)); } }