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

Say*_*yom 5 cucumber cucumber-jvm cucumber-junit meteor-cucumber

我有一个变量,我想在所有步骤中传递这个变量.任何人都可以建议使用代码片段示例,请参阅如何在步骤之间传递变量值.任何帮助将受到高度赞赏.

Seb*_*ose 12

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

使用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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • PicoContainer(cucumber-picocontainer.jar)
  • Guice(cucumber-guice.jar)
  • 焊接(cucumber-weld.jar)
  • 春天(cucumber-spring.jar)
  • OpenEJB(cucumber-openejb.jar)

您还需要安装选定的DI容器本身,因为Cucumber罐子只提供Cucumber和DI容器之间的集成.


N..*_*N.. 4

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));
}
Run Code Online (Sandbox Code Playgroud)

  • 此技术很有用,但依赖于变量的范围和可见性。它可能会导致场景之间的状态泄漏,这将是一件坏事。 (4认同)