Cucumber 如何在Java中的步骤之间传递变量值?

Cucumber 如何在Java中的步骤之间传递变量值?,cucumber,cucumber-jvm,cucumber-junit,meteor-cucumber,Cucumber,Cucumber Jvm,Cucumber Junit,Meteor Cucumber,我有一个变量,我想在所有步骤中传递这个变量。 任何人都可以用一个代码片段示例来建议如何在步骤之间传递变量值。 非常感谢您提供的任何帮助。在Cucumber for Java(Cucumber jvm)中,在步骤之间共享数据的预期方式是使用依赖项集成(DI)容器,其中一些容器已与Cucumber集成 private static String myName = null; @Given("I have a cucumber step") public void i_have_a_cucumber

我有一个变量,我想在所有步骤中传递这个变量。 任何人都可以用一个代码片段示例来建议如何在步骤之间传递变量值。 非常感谢您提供的任何帮助。

在Cucumber for Java(Cucumber jvm)中,在步骤之间共享数据的预期方式是使用依赖项集成(DI)容器,其中一些容器已与Cucumber集成

private static String myName = null;

@Given("I have a cucumber step")
public void i_have_a_cucumber_step() throws Throwable {
    myName = "Stackoverflow"

}

@Given("^I have (\\d+) (.*) in my basket$")
public void i_have_in_my_basket(int number, String veg) throws Throwable {
    System.out.println(myName));
}
使用DI的方法因容器而异,但下面是使用PicoContainer的示例:

// MySharedData.java
public class MySharedData {
    public String stringData;
}

// SomeStepDefs.java
public class SomeStepDefs {
    private MySharedData sharedData;

    public SomeStepDefs(MySharedData sharedData) {
        this.sharedData = sharedData;
    }

    // StepDefs omitted
}

// MoreStepDefs.java
public class MoreStepDefs {
    private MySharedData sharedData;

    public MoreStepDefs(MySharedData sharedData) {
        this.sharedData = sharedData;
    }

    // StepDefs omitted
}
DI容器将确保为每个场景创建一个MySharedData实例,并将其传递给需要它的每个步骤定义类。这种方法的好处是Cucumber可以确保场景之间没有共享状态泄漏,因为为每个场景重新创建注入的依赖项

上面的示例使用构造函数注入(因此注入的依赖项由构造函数参数指定),但其他DI容器也支持其他注入机制,例如Spring的
@Autowired

要让Cucumber使用DI,您需要选择一个(并且只有一个)DI集成,并将其包含在类路径(或POM)中。选择是:

  • PicoContainer(cumber PicoContainer.jar)
  • Guice(cumber Guice.jar)
  • 焊接(Cumber Weld.jar)
  • 弹簧(cumberspring.jar)
  • OpenEJB(cumber OpenEJB.jar)

您还需要安装所选DI容器本身,因为Cucumber jar只提供Cucumber和DI容器之间的集成。

此技术很有用,但取决于变量的范围和可见性。正如@SebRose所说,上面的例子看起来不错,直到您发现另一个功能文件使用一个Java类中的给定,然后在另一个Java类中使用then,现在您需要的信息需要从给定转到then。Cucumber是一种不同于其他BDD的野兽。它真的会影响你把给定的东西放在一个单独的类中,当你在一个单独的类中,然后在一个单独的类中,使用一些策略在它们之间共享信息(世界模式,依赖注入,…)你能用一个Hashmap吗?或者甚至是包含一个hashmap的对象?只要您选择的DI容器可以管理您选择的类的实例,那么是的。