簡體   English   中英

@Before 不在 java Cucumber Step 中執行

[英]@Before doesn't execute in java Cucumber Step

我有一個 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

  1. 確保您使用的是cucumber.annotation.Before而不是org.junit.Before Cucumber 不會處理 JUnit 注釋。 (更多信息請參見本博文的 Scenario Hooks 部分。)

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

您好,我知道這是一篇舊帖子,但這些解決方案都不適合我。 所以我要分享我的解決方案。

我在包下創建了類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();
      }

    }

然后我在 runner 的膠水選項中指定了包:

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

它奏效了。

這個問題有一個公認的答案,但我想指出馬特沃森的評論,它為我解決了這個問題,我在其他地方沒有看到類似的建議:

我玩了一些我的黃瓜 jvm 測試,我想我已經發現了。 你的@Before方法應該是public而不是private

@Before方法必須public

我知道這個問題很老,但如果有人使用 IntelliJ 遇到同樣的問題:

檢查運行/調試配置中的“膠水”屬性。 這是 Glue(來自 Cucumber 的自動裝配系統)用來查找要連接的類的路徑列表。
似乎 IntelliJ 正在生成此屬性,如果它沒有在“Cucumber Java”-Configs 的模板中明確定義。

我不知道它是如何生成的,但對我來說,包含我的類和有問題的 Before-Method 的包不存在。 添加后一切正常。

編輯:

發現更多背景信息。 IntelliJ Cucumber Plugin 不使用 Junit 或 TestNG,而是使用他自己實現的運行器套件。 此運行程序不解釋來自 Cucumber 的基於注釋的配置,僅解釋來自 Cucumber 屬性文件或系統屬性的配置。 然而,TestNG-Suite 總是覆蓋 Glue-Path,不管它是實際設置還是存在。 我發現的最一致的方法是使用注釋和屬性來配置它。 這樣,您始終可以確保使用了配置(Gradle-Runner、TestNG-Runner、IntellijCucumber-Runner)

我知道這是一個老問題,但我找到了一個使用 5.5.0 版本的 Cucumber java 的解決方案:我將 Hooks 類添加到 Steps 包中,只有膠水 =“Step classpath”,它對我來說很好用 :)

希望有幫助!!

在我的情況下,添加了一個包,其中 @Before 被定義為膠水參數:

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

就我而言,當我在 Cucumber 選項中放置“dryRun = false”時它起作用了。

檢查我的測試運行程序類粘合測試運行程序中的鈎子已經解決了我在這個包“ 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 {

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM