@Before不会在java Cucumber Step中执行

时间:2014-06-04 04:58:53

标签: java cucumber bdd

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

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

然后我得到了许多依赖于loginPage设置的步骤。 e.g。

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

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

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

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

看到

7 个答案:

答案 0 :(得分:30)

  1. 确保您使用的是cucumber.annotation.Before而不是org.junit.Before。黄瓜不会处理JUnit注释。 (this blog post的Scenario Hooks部分中的更多信息。)

  2. 确保您的@Before方法为public,而不是private

答案 1 :(得分:7)

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

我在包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();
      }

    }

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

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

它有效。

答案 2 :(得分:6)

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

  

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

@Before方法必须public

答案 3 :(得分:1)

我知道这是一个老问题,但是我找到了使用5.5.0版的黄瓜java解决方案: 我将Hooks类添加到了Steps包中,只具有粘胶=“ Step classpath”,对我来说效果很好:)

希望有帮助!

答案 4 :(得分:0)

在我的案例中,添加了一个包,其中在胶水参数中定义了@Before:

@CucumberOptions(glue = {"cucumber.hook", "cucumber.steps"})

答案 5 :(得分:0)

我知道这个问题已经很久了,但是如果有人使用IntelliJ遇到了同样的问题:

在“运行/调试”配置中检查“胶水”属性。 这是Glue(来自Cucumber的自动布线系统)用来查找要布线的类的路径的列表。
如果未在“黄瓜Java”模板-Configs的模板中专门定义该属性,似乎IntelliJ正在生成此属性。

我不知道它是如何生成的,但是对我来说,包含我的类以及相关方法的包并不存在。添加后,一切正常。

答案 6 :(得分:0)

就我而言,当我在Cucumber选项中输入“ dryRun = false”时,它就起作用了。