package com.flextrade.jfixture.builders;
import com.flextrade.jfixture.NoSpecimen;
import com.flextrade.jfixture.SpecimenBuilder;
import com.flextrade.jfixture.SpecimenContext;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertSame;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class TestCompositeBuilder {
@Mock
private SpecimenContext mockContext;
@Mock
private SpecimenBuilder mockBuilderA;
@Mock
private SpecimenBuilder mockBuilderB;
private CompositeBuilder compositeBuilder;
private final Object request = new Object();
@Before
public void initialise() {
MockitoAnnotations.initMocks(this);
compositeBuilder = new CompositeBuilder(mockBuilderA, mockBuilderB);
}
@Test
public void first_builder_returns_result_is_the_return_value() {
Object request = new Object();
Object builderAResult = new Object();
when(mockBuilderA.create(request, mockContext)).thenReturn(builderAResult);
Object result = compositeBuilder.create(request, mockContext);
assertSame(builderAResult, result);
}
@Test
public void first_builder_returns_result_does_not_call_create_on_other_builders() {
Object builderAResult = new Object();
when(mockBuilderA.create(request, mockContext)).thenReturn(builderAResult);
compositeBuilder.create(request, mockContext);
verify(mockBuilderB, never()).create(request, mockContext);
}
@Test
public void first_builder_returns_no_specimen_returns_result_of_next_builder_with_valid_result() {
Object builderBResult = new Object();
when(mockBuilderA.create(request, mockContext)).thenReturn(new NoSpecimen());
when(mockBuilderB.create(request, mockContext)).thenReturn(builderBResult);
Object result = compositeBuilder.create(request, mockContext);
assertSame(builderBResult, result);
}
@Test
public void no_builders_can_satisfy_request_returns_no_specimen() {
when(mockBuilderA.create(request, mockContext)).thenReturn(new NoSpecimen());
when(mockBuilderB.create(request, mockContext)).thenReturn(new NoSpecimen());
Object result = compositeBuilder.create(request, mockContext);
assertEquals(new NoSpecimen(), result);
}
}