Java Cumber JVM:在步骤定义中调用场景或场景大纲

Java Cumber JVM:在步骤定义中调用场景或场景大纲,java,cucumber,cucumber-java,Java,Cucumber,Cucumber Java,我有一个步骤定义,其中我传递场景或场景大纲的名称: @When("^I execute the steps of the following scenario or scenario outline: \"([^\"]*)\"$") public void execute_steps_of_the_scenario_or_scenario_outline(String name){ ... } 我的意图是执行被调用场景/场景大纲的所有步骤,并将这些执行的步骤附加到当前场景中。这意味着被调用场景

我有一个步骤定义,其中我传递场景或场景大纲的名称:

@When("^I execute the steps of the following scenario or scenario outline: \"([^\"]*)\"$")
public void execute_steps_of_the_scenario_or_scenario_outline(String name){
...
}
我的意图是执行被调用场景/场景大纲的所有步骤,并将这些执行的步骤附加到当前场景中。这意味着被调用场景的步骤将成为当前场景的一部分


然而,我一直无法找到一种方法来做到这一点。

Cucumber和BDD/TDD通常不应该这样使用。每个场景/测试都应该相互隔离,从一个场景到另一个场景执行步骤不是一个好的做法

您可以使用功能上的后台步骤在该功能的场景中执行公共步骤,也可以使用标记在使用挂钩执行场景之前和/或之后执行特定的一组操作

话虽如此,您可以在glue代码中编写一些逻辑来维护在每个场景中调用的步骤方法列表,并在后续场景中调用相同的步骤列表。这假设您可以保证场景的执行顺序,这也是针对所有TDD最佳实践的。下面是实现我刚才描述的功能的框架代码示例

private Scenario scenario;

private Map<String, List<String>> scenarioSteps = new HashMap<>();

@Before
public void setUp(Scenario scenario) {

    this.scenario = scenario;

    scenarioSteps.put(scenario.getName(), new LinkedList<>());
}

@Given("^the first step is executed$")
public void the_first_step_is_executed() {

    final StackTraceElement stackTraceElement = Thread.currentThread().getStackTrace()[1];

    scenarioSteps.get(scenario.getName()).add(stackTraceElement.getClassName() + "." + stackTraceElement.getMethodName());
}

将步骤添加到scenarioSteps后,我将如何在代码中执行该步骤?如果步骤的粘合代码需要一个参数/参数,那么我如何能够重用我执行步骤的场景中的define参数?您需要为与场景关联的步骤维护一个更复杂的对象列表。例如,您可以主控自定义步骤对象的列表,该对象的属性为与该步骤关联的class.method,以及具有该步骤所需参数的映射。