@之前没有';t在javacumber步骤中执行

@之前没有';t在javacumber步骤中执行,java,cucumber,bdd,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

我有一个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();
}
我有多个步骤的课程。上述两种方法都在同一个步骤类中。 但是,loginPage始终为空。从未调用BeforeCasenario方法。我是否完全误解了@Before的作用?关于如何获得我想要的工作有什么建议吗

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

编辑:Pom可在以下位置查看:

  • 确保您使用的是
    cucumber.annotation.Before
    而不是
    org.junit.Before
    。Cucumber不会处理JUnit注释。(有关详细信息,请参见的“场景挂钩”部分。)

  • 确保@Before方法是
    public
    ,而不是
    private


  • 这个问题有一个公认的答案,但我想指出马特·沃森(Matt Watson)的评论,该评论为我解决了这个问题,我在其他地方没有看到类似的建议:


    我已经对我的一些黄瓜jvm测试做了一番尝试,我想我已经发现了。您的
    @Before
    方法应该是
    public
    而不是
    private


    @Before
    方法必须是
    public

    你好,我知道这是一篇老文章,但这些解决方案都不适合我。所以我要分享我的解决方案

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

    它成功了。

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

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

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

    检查运行/调试配置中的“Glue”属性。 这是Glue(Cucumber的自动连线系统)用于查找要连线的类的路径列表。
    如果IntelliJ没有在“Cucumber Java”-Configs的模板中明确定义,那么它似乎正在生成此属性

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

    编辑:

    了解更多背景信息。IntelliJ Cumber插件不使用Junit Order TestNG,而是使用他自己实现的runner套件。此运行程序不会从Cucumber中插入基于注释的配置,只插入Cucumber属性文件或系统属性中的配置。 然而,TestNG套件总是覆盖粘合路径,不管它是实际设置的还是存在的。
    我发现的最一致的方法是使用注释和属性来配置它。通过这种方式,您始终可以确定是否使用了配置列表(Gradle Runner、TestNG Runner、IntellijCucumber Runner)

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


    希望有帮助

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

    你怎么知道在场景从未被调用之前。您是否尝试过在此处插入
    println
    。试着看看它是否被打印出来。我知道它从未被调用,因为我在IDE中运行时在那里放了断点,但我从未点击过它们。我也知道,因为@after注释方法中的LOGGER.info(“Running after!”)行显示在我的日志中,而before场景的预期日志行未写入日志中。请检查cucumber.yml是否已粘贴挂钩路径,它适用于我的
    1.1.5和1.1.6
    。你使用的是哪个版本?@Bala:我是1.1.7版,但降级到1.1.5版没有帮助。当我看到这篇文章时,我很兴奋,因为它似乎是一个可能的问题,而且很容易被忽略。但是,我使用cumber.api.java.Before注释。我以前找不到cucumber.annotation.com,我想它在以后的版本中被删除了。我已经玩了一些cucumber jvm测试,我想我已经发现了它。你的
    @Before
    方法应该是
    public
    而不是
    private
    容易忽略的2号方法。非常感谢,这是一个好地方。
    import cucumber.api.java.Before是正确的输入谢谢!我也有同样的问题是的,谢谢你的回答;为了改进答案,诀窍在于将包包含为“胶水”参数。这是大多数人错误的地方。如果钩子是在单独的包中创建的,请忘记在runner中提到包名。回答得好+这对我有帮助。我还想说,通过复制这一行()并搜索一个“粘合”词,您可以分析测试运行的参数,然后您将能够识别intellij用于运行测试的参数
    
    @CucumberOptions(glue = {"cucumber.hook", "cucumber.steps"})