package org.jbehave.scenario.finegrained.junit.monitoring; import org.jbehave.scenario.Configuration; import org.jbehave.scenario.JUnitScenario; import org.jbehave.scenario.reporters.ScenarioReporter; import org.jbehave.scenario.steps.Steps; import java.lang.annotation.Annotation; public class ReflectionHelper { private final Class<?> invokingClass; private final Class<? extends JUnitScenario> testClass; public ReflectionHelper(Class<?> invokingClass, Class<? extends JUnitScenario> testClass) { this.invokingClass = invokingClass; this.testClass = testClass; } public <T> T getInstance(Class<T> targetClass) { try { return targetClass.newInstance(); } catch (Exception e) { throw new IllegalArgumentException(targetClass.toString() + " must have default constructor to use custom runner " + invokingClass.toString()); } } public void checkForAnnotation(Class<? extends Annotation> annotationClass) { Annotation annotation = testClass.getAnnotation(annotationClass); if (annotation == null) { throw new IllegalArgumentException(testClass.toString() + " must declare annotation " + annotationClass.toString() + " to use custom runner " + invokingClass.toString()); } } public Configuration reflectMeAConfiguration() { checkForAnnotation(UseConfiguration.class); Class<? extends Configuration> configurationClass = testClass.getAnnotation( UseConfiguration.class).value(); return getInstance(configurationClass); } public Steps reflectMeCandidateSteps() { checkForAnnotation(UseSteps.class); Class<? extends Steps> StepsClass = testClass.getAnnotation(UseSteps.class).value(); return getInstance(StepsClass); } public JUnitScenario reflectMeATestInstance(JUnitScenarioReporter reporter) { try { return testClass.getConstructor(ScenarioReporter.class).newInstance(reporter); } catch (Exception e) { throw new IllegalArgumentException(testClass.toString() + "must have constructor with the following args: (" + ClassLoader.class.toString() + ", " + ScenarioReporter.class.toString() + ") in order to use custom runner " + this.getClass().toString(), e); } } }