@Before不会在java Cucumber Step中执行

Pet*_*son 13 java bdd cucumber

我有一个Cucumber Step类,我正在尝试初始化所有场景的页面模型.所以我添加了@Before带注释的方法:

@Before()
private void beforeScenario() {
    LOGGER.info("Running before!");
    loginPage = BrowserDriver.getPageModel(LoginPage.class);
}
Run Code Online (Sandbox Code Playgroud)

然后我有一堆依赖于loginPage设置的步骤.例如

@When("^I click the help link$")
public void I_click_the_help_link() {
    loginPage.clickHelpLink();
}
Run Code Online (Sandbox Code Playgroud)

我有多个Step类.上述两种方法都在同一个Step类中.但是loginPage始终为null.永远不会调用beforeScenario方法.我是否完全误解了@Before是如何工作的?关于如何获得我想要的工作的任何提示?

编辑:我还有一个@After带注释的方法,它可以在每个场景之后按预期运行.

编辑:Pom可以在http://pastebin.com/PJ6qQRK9上看到

Mat*_*son 36

  1. 确保你使用cucumber.annotation.Before而不是org.junit.Before.黄瓜不会处理JUnit注释.(此博客文章的Scenario Hooks部分中提供了更多信息.)

  2. 确保你的@Before方法public不是private.

  • 我有一些关于我的黄瓜jvm测试的游戏,我想我已经发现了它.你的`@ Before`方法应该是`public`而不是`private` (10认同)
  • 正确的导入是import banana.api.java.Before; (3认同)

小智 8

您好我知道这是一个旧帖子,但这些解决方案都不适合我.所以我要分享我的解决方案.

我在Hooks包下创建了这个类:com.mycompany.automation.util

package com.mycompany.automation.util;

import com.mycompany.automation.rest.database.AS400DBManager;
import cucumber.api.java.After;
import java.sql.SQLException;

/**
 * @author <a href="mesaj@mycompany.com">Julian Mesa</a>
 * @version 0.1.0
 * @since 0.1.0
 */

    public class Hooks {

      @After
      public void beforeScenario() throws SQLException, ClassNotFoundException {
        System.out.print("Closing connection.");
        AS400DBManager.getInstance().closeConnection();
      }

    }
Run Code Online (Sandbox Code Playgroud)

然后我在跑步者的胶水选项中指定了包:

@RunWith(CucumberWithSerenity.class)
@CucumberOptions(
    features = "src/test/resources/features",
    glue = {"com.mycompany.automation.features.steps",
        "com.mycompany.automation.util"}
)
Run Code Online (Sandbox Code Playgroud)

它奏效了.

  • 这是大多数人犯错误的地方。如果在单独的包中创建挂钩,请忘记在运行程序中提及包名称。很好的答案。+1 (2认同)

小智 6

这个问题有一个公认的答案,但我想指出Matt Watson为我解决这个问题的评论,我在其他地方没有看到类似的建议:

我有一些关于我的黄瓜jvm测试的游戏,我想我已经发现了它.你的@Before方法应该是public而不是private

@Before方法必须public.