【问题标题】:How to call implemented step from one step definition into some other step definition using Java in Cucumber如何在 Cucumber 中使用 Java 将已实现的步骤从一个步骤定义调用到其他步骤定义
【发布时间】:2017-07-23 15:57:48
【问题描述】:

我正在尝试调用下面的步骤定义实现

@Given("^a user is logged into application with \"([^\"]*)\" and \"([^\"]*)\"$")

public void a_user_is_logged_into_application_with_and(String arg1, String arg2) throws Throwable 
{
        open();
        login(arg1, arg2);

    }

来自另一个步骤定义实现,如下所示:

@Given("^Run Add Business scenario$")
    public void run_Add_Business_scenario() {

         Given("a user is logged into application with 'clfmanager' and 'rules'");

    }

我做不到,有没有我可以做到的?

【问题讨论】:

  • 你不能在 cucumber 中这样做,你可以做的是创建另一个调用这两个函数感兴趣的步骤。
  • 在 ruby​​ 中使用 cucumber,很容易做到。我现在对 cucumber java 很熟悉,但我发现了类似 github.com/cucumber/cuke4duke/wiki/… 的东西。希望这会有所帮助。
  • 很高兴能详细了解为什么您无法完成您想做的事情。你收到错误了吗?分享所发生事情的详细信息有助于获得更好的答案。

标签: java selenium cucumber


【解决方案1】:

编辑:托马斯提供了一个实际的正确答案。我试图复制问题试图做的事情,而不是解决手头的实际问题。再次感谢托马斯!

托马斯是正确的。要扩展它,您可以执行类似于以下的操作:

@Given("Login with username (.+) and password (.+)")
public void login(String user, String pass){
   // Login here
}

@Given("Login with defaults")
public void loginWithDefaults(){
   login("defaultUser","defaultPass")
}

请记住,即使我们使用 Given/When/Then,这些仍然只是方法,可以用作方法。

【讨论】:

  • 这个例子恐怕是从另一个步骤调用一个步骤的例子。这正是你不应该做的。我将在答案中展开为什么。
【解决方案2】:

@canpan14 建议这个解决方案:

@Given("Login with username (.+) and password (.+)")
public void login(String user, String pass){
   // Login here
}

@Given("Login with defaults")
public void loginWithDefaults(){
   login("defaultUser","defaultPass")
}

不幸的是,这是从另一个步骤调用一个步骤的示例。

我提倡的解决方案看起来更像这样:

public class LoginSteps {

    private LoginHelper loginHelper = new LoginHelper();

    @Given("Login with username (.*) and password (.*)")
    public void login(String user, String pass) {
       loginHelper.login(user, pass)
    }

    @Given("Login with defaults")
    public void loginWithDefaults() {
       loginHelper.login("defaultUser", "defaultPass")
    }
}

具有可重用逻辑的辅助类:

public class LoginHelper {
    public void login(user, pass) {
        // login logic lives here and can be referenced from multiple steps
    }
}

最大的不同是我将登录逻辑提取到了帮助类中的一个方法中。这使我可以编写易于理解的单行步骤。

我将辅助方法移至另一个类,以确保无论您从哪个步骤类调用它都易于掌握。

【讨论】:

    【解决方案3】:

    解决办法是不要这样做。

    您应该做的是创建两个步骤都使用的辅助类。这是在 Cucumber 中重用和避免重复的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多