Один из способов получить переменные времени выполнения - использовать опцию плагина.Хотя это выглядит как злоупотребление интерфейсом Reporter
для доступа к переменной StepDefinitionMatch
для Cucumber версии 1.2.5 .
. Для этого создайте пользовательский класс, который реализует Reporter
интерфейс.
public class CustomFormatter implements Reporter{
public CustomFormatter() { }
@Override
public void before(Match match, Result result) {}
@Override
public void result(Result result) {}
@Override
public void after(Match match, Result result) {}
@Override
public void match(Match match) {
ThreadLocalStepDefinitionMatch.set((StepDefinitionMatch)match);
}
@Override
public void embedding(String mimeType, byte[] data) {}
@Override
public void write(String text) {}
}
Класс ThreadLocal
для хранения переменной StepDefinitionMatch
.
public class ThreadLocalStepDefinitionMatch {
private static final ThreadLocal<StepDefinitionMatch> threadStepDefMatch = new InheritableThreadLocal<StepDefinitionMatch>();
private ThreadLocalStepDefinitionMatch() {
}
public static StepDefinitionMatch get() {
return threadStepDefMatch.get();
}
public static void set(StepDefinitionMatch match) {
threadStepDefMatch.set(match);
}
public static void remove() {
threadStepDefMatch.remove();
}
}
Объявление пользовательского плагина в классе бегуна
@CucumberOptions(plugin = { "pretty", "html:report", "json:reports.json",
"rerun:target/rerun.txt", "cusform.CustomFormatter" }
Наконецдоступ к переменной StepDefinitionMatch
в классе определения шага
@When("^user gets count from \"([^\"]*)\"$")
public void userGetsCountFromAndStores(String arg) {
StepDefinitionMatch match = ThreadLocalStepDefinitionMatch.get();
System.out.println(match.getStepName());
System.out.println(match.getPattern());
System.out.println(match.getArguments());
}
Вывод на консоль дает следующее
user gets count from "Car1"
^user gets count from "([^"]*)"$
[Car1]
Вы используете довольно старую версию Cucumber, если вы обновляетек огурцу 2 будут некоторые изменения.StepDefinitionMatch
заменено на PickleTestStep
.Объявление в бегуне остается прежним.Класс ThreadLocal
меняет сохраненный класс на PickleTestStep
.
Пользовательский форматер становится
public class CustomFormatter implements Formatter {
public CustomFormatter() {}
private EventHandler<TestStepStarted> stepStartedHandler = new EventHandler<TestStepStarted>() {
@Override
public void receive(TestStepStarted event) {
handleTestStepStarted(event);
}
};
@Override
public void setEventPublisher(EventPublisher publisher) {
publisher.registerHandlerFor(TestStepStarted.class, stepStartedHandler);
}
private void handleTestStepStarted(TestStepStarted event) {
if(event.testStep instanceof PickleTestStep) {
ThreadLocalPickleStep.set((PickleTestStep)event.testStep);
}
}
}
Доступ к переменной StepDefinitionMatch в классе определения шага
@When("^user gets count from \"([^\"]*)\"$")
public void userGetsCountFromAndStores(String arg) {
System.out.println(ThreadLocalPickleStep.get().getStepText());
System.out.println(ThreadLocalPickleStep.get().getPattern());
System.out.println(ThreadLocalPickleStep.get().getDefinitionArgument());
}
Вывод такой же, как и раньше.