【问题标题】:@Before doesn't execute in java Cucumber Step@Before 不在 java Cucumber Step 中执行
【发布时间】:2014-06-04 04:58:52
【问题描述】:

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

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

然后,我得到了一堆依赖于设置 loginPage 的步骤。例如

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

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

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

编辑:Pom 可见于:http://pastebin.com/PJ6qQRK9

【问题讨论】:

  • 你怎么知道beforeScenario 永远不会被调用。您是否尝试过在那里插入println。试试看它是否被打印出来。
  • 我知道它从来没有被调用过,因为我在 IDE 中运行时将断点放在那里,但我从来没有碰到过它们。我也知道,因为我的 @After 注释方法中的 LOGGER.info("Running after!") 行显示在我的日志中,而 beforeScenario 的预期日志行未写入日志。
  • 检查你的 cucumber.yml 是否粘贴了 hooks 路径
  • 它适用于我的版本1.1.5 and 1.1.6。你是哪个版本的?
  • @Bala :我是 1.1.7 版本,但降级到 1.1.5 没有帮助。

标签: java cucumber bdd


【解决方案1】:
  1. 确保您使用的是cucumber.annotation.Before 而不是org.junit.Before。 Cucumber 不会处理 JUnit 注释。 (更多信息请参见this blog post 的场景挂钩部分。)

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

【讨论】:

  • 当我看到这篇文章时我很兴奋,因为这似乎是一个可能的问题并且很容易疏忽。但是我使用的是 cucumber.api.java.Before 注释。我找不到 cucumber.annotation。之前,我想它在以后的版本中被删除了。
  • 我对我的一些 cucumber-jvm 测试进行了尝试,我想我已经发现了它。你的@Before 方法应该是public 而不是private
  • 易监督 2 号拥有它。非常感谢,这是个好地方。
  • import cucumber.api.java.Before; 是正确的导入
  • 谢谢!我有完全相同的问题
【解决方案2】:

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

我在包下创建了类Hookscom.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"}
)

它奏效了。

【讨论】:

  • 是的,谢谢你的回答;为了改进答案,诀窍在于将包包含为“胶水”参数。
  • 这是大多数人错误的地方。如果挂钩是在单独的包中创建的,则忘记在运行器中提及包名。不错的答案。 +1
【解决方案3】:

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

我对我的一些 cucumber-jvm 测试进行了尝试,我想我已经发现了它。你的@Before 方法应该是public 而不是private

@Before 方法必须public

【讨论】:

    【解决方案4】:

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

    希望有帮助!!

    【讨论】:

      【解决方案5】:

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

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

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

      编辑:

      了解更多背景信息。 IntelliJ Cucumber 插件不使用 Junit oder TestNG,而是他自己实现的运行器套件。此运行器不会解释 Cucumber 中基于注释的配置,仅解释来自 Cucumber 属性文件或系统属性的配置。 然而,TestNG-Suite 总是覆盖 Glue-Path,不管它是否实际设置或存在。 我发现最一致的方法是使用注释和属性来配置它。这样你总是可以确定你使用的是配置文件(Gradle-Runner、TestNG-Runner、IntellijCucumber-Runner)

      【讨论】:

      • 这对我有帮助。我还想说的是,您可以通过复制这一行 (i.imgur.com/pKbhyns.png) 并搜索“胶水”一词来分析您的测试运行的参数,然后您将能够识别 intellij 用于运行测试的参数
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          检查我的测试运行器类在测试运行器中粘合钩子解决了我在这个包“com.memberweb.utilities”中定义的钩子的问题

          @RunWith(Cucumber.class)
          @CucumberOptions(
                  features = "src/test/resources/features",
                  glue = {"com/memberweb/stepDefinitions","com.memberweb.utilities"},
                  plugin = {"pretty",
                          "html:target/cucumber-reports/cucumber.html",
                          "json:target/cucumber-reports/CucumberTestReport.json"
                          },
                  monochrome = true
          )
          public class testRunner {
          
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-08-31
            • 1970-01-01
            • 1970-01-01
            • 2016-09-23
            • 2022-09-30
            • 1970-01-01
            • 2012-02-05
            相关资源
            最近更新 更多