web-dev-qa-db-ja.com

@BeforeがJavaきゅうりのステップで実行されない

すべてのシナリオでページモデルを初期化しようとしている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クラスにあります。ただし、loginPageは常にnullです。 beforeScenarioメソッドが呼び出されることはありません。 @Beforeがどのように機能するかを完全に誤解していますか?働きたいものを手に入れるためのヒントはありますか?

編集:私はまた、すべてのシナリオの後に期待どおりに実行される@Afterアノテーション付きメソッドを持っています。

編集:Pomは次の場所で確認できます: http://Pastebin.com/PJ6qQRK9

14
Peter Wilkinson
  1. cucumber.annotation.Beforeではなくorg.junit.Beforeを使用していることを確認してください。 CucumberはJUnitアノテーションを処理しません。 (詳細は このブログ投稿 のシナリオフックセクションにあります。)

  2. @Beforeメソッドがpublicではなくprivateであることを確認してください。

39
Matt Watson

こんにちは私はそれが古い投稿であることを知っていますが、これらの解決策のどれも私のために機能しません。だから私は私のソリューションを共有するつもりです。

パッケージの下にクラス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="[email protected]">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"}
)

そしてそれはうまくいった。

10
Julian Mesa

この質問への回答は認められていますが、私にとって問題を解決して他の場所で同様のアドバイスを見たことがないマットワトソンのコメントを指摘したいと思います。

私はcucumber-jvmテストのいくつかを試してみましたが、私はそれを見つけたと思います。きみの @Beforeメソッドはpublicではなくprivateである必要があります

@Beforeメソッド必須publicである必要があります。

6
ndurante

これは古い問題であることはわかっていますが、キュウリJavaの5.5.0バージョンを使用した解決策を見つけました。HooksクラスをStepsパッケージに追加し、glue = "Step classpath"のみを指定したところ、問題なく動作しました:)

それが役に立てば幸い!!

1
user12929377

私の場合、@ Beforeがglueパラメータに定義されているパッケージの追加が機能しました:

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

私はこの問題が古いことを知っていますが、誰かがIntelliJを使用して同じ問題に遭遇した場合:

実行/デバッグ構成の「接着」プロパティを確認します。これは、グルー(Cucumberからの自動配線システム)が配線するクラスを見つけるために使用するパスのリストです。
「Cucumber Java」-Configsのテンプレートで具体的に定義されていない場合、IntelliJがこのプロパティを生成しているようです。

どのように生成されるのかはわかりませんが、問題のBefore-Methodを持つクラスを含むパッケージは存在しませんでした。追加した後、すべてが正常に動作しました。

編集:

より多くの背景情報を見つけました。 IntelliJ CucumberプラグインはJunitまたはTestNGを使用しませんが、彼自身が実装したランナースイートを使用します。このランナーは、Cucumberのアノテーションベースの構成を解釈しません。Cucumberのプロパティファイルまたはシステムプロパティの構成のみを解釈します。ただし、TestNG-Suiteは、実際に設定されているか存在しているかに関係なく、常にGlue-Pathを上書きします。私が見つけた最も一貫した方法は、アノテーションとプロパティの両方を使用して構成することでした。そうすれば、設定が使用されていないことが常に確実になります(Gradle-Runner、TestNG-Runner、IntellijCucumber-Runner)

0
Leo Hilbert