package net.thucydides.core.steps;
import net.thucydides.core.annotations.InvalidStepsFieldException;
import net.thucydides.core.annotations.Step;
import net.thucydides.core.annotations.Steps;
import net.thucydides.core.pages.Pages;
import net.thucydides.core.reflection.FieldSetter;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.lang.reflect.Field;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.doThrow;
public class WhenUsingAnnotatedStepLibraries {
class StepLibrary extends ScenarioSteps {
public StepLibrary(final Pages pages) {
super(pages);
}
@Step
public void step1() {}
@Step
public void step2() {}
}
class UserStory {
@Steps
public StepLibrary stepLibrary;
public StepLibrary unannotatedStepLibrary;
}
class UserStoryWithWrongStepType {
@Steps
public Object stepLibrary;
public StepLibrary unannotatedStepLibrary;
}
class UserStoryWithNoSteps {
public List stepLibrary;
public StepLibrary unannotatedStepLibrary;
}
@Test
public void should_find_annotated_step_library() {
List<StepsAnnotatedField> stepsFields = StepsAnnotatedField.findOptionalAnnotatedFields(UserStory.class);
assertThat(stepsFields.size(), is(1));
}
@Test
public void annotated_step_library_can_be_of_any_type() {
List<StepsAnnotatedField> stepsFields = StepsAnnotatedField.findOptionalAnnotatedFields(UserStoryWithWrongStepType.class);
assertThat(stepsFields.size(), is(1));
}
@Test(expected=InvalidStepsFieldException.class)
public void step_index_must_have_an_annotated_step_provided() {
StepsAnnotatedField.findMandatoryAnnotatedFields(UserStoryWithNoSteps.class);
}
@Mock FieldSetter fieldSetter;
@Mock ScenarioSteps scenarioSteps;
@Mock Object testCase;
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
}
class TestStepsAnnotatedField extends StepsAnnotatedField {
TestStepsAnnotatedField(Field field) {
super(field);
}
@Override
protected FieldSetter set(Object targetObject) {
return fieldSetter;
}
}
@Test(expected = InvalidStepsFieldException.class)
public void should_throw_exception_if_pages_object_field_cannot_be_accessed() throws Exception {
doThrow(new IllegalAccessException()).when(fieldSetter).to(anyObject());
Field field = null; // value ignored
TestStepsAnnotatedField testField = new TestStepsAnnotatedField(field);
testField.setValue(testCase, scenarioSteps);
}
}