package com.flextrade.jfixture.builders; import com.flextrade.jfixture.FactoryMethodQuery; import com.flextrade.jfixture.NoSpecimen; import com.flextrade.jfixture.SpecimenContext; import com.flextrade.jfixture.specifications.Specification; import com.flextrade.jfixture.utility.SpecimenType; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import testtypes.constructors.TwoConstructorType; import testtypes.factorymethods.TypeWithFactoryMethod; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyObject; import static org.mockito.Mockito.when; public class TestClassToFactoryMethodRelay { private ClassToFactoryMethodRelay relay; @Mock private SpecimenContext mockSpecimenContext; @Mock private FactoryMethodQuery mockFactoryMethodQuery; @Mock private Specification mockSpecification; @Before public void initialise() { MockitoAnnotations.initMocks(this); when(this.mockSpecification.isSatisfiedBy(any())).thenReturn(true); ArrayList<Method> methods = new ArrayList<Method>(Arrays.asList(TypeWithFactoryMethod.class.getMethods())); when(this.mockFactoryMethodQuery.getFactoryMethodsForType(SpecimenType.of(TypeWithFactoryMethod.class))).thenReturn(methods); this.relay = new ClassToFactoryMethodRelay(this.mockFactoryMethodQuery, this.mockSpecification); } @Test public void if_request_does_not_satisfy_specification_returns_no_specimen() { when(this.mockSpecification.isSatisfiedBy(any())).thenReturn(false); Object result = this.relay.create(TypeWithFactoryMethod.class, mockSpecimenContext); assertEquals(new NoSpecimen(), result); } @Test public void if_factory_method_query_returns_empty_create_returns_no_specimen() { when(this.mockFactoryMethodQuery.getFactoryMethodsForType(SpecimenType.of(TypeWithFactoryMethod.class))).thenReturn(new ArrayList<Method>()); Object result = this.relay.create(TwoConstructorType.class, mockSpecimenContext); assertEquals(new NoSpecimen(), result); } @Test public void returns_result_of_context_resolve() { Object contextResult = new Object(); when(mockSpecimenContext.resolve(anyObject())).thenReturn(contextResult); Object result = this.relay.create(SpecimenType.of(TypeWithFactoryMethod.class), mockSpecimenContext); assertSame(contextResult, result); } }