重新初始化变量的值

Value of variable being reinitialized

我有一个 class 记者。在构造函数中,我已经初始化了一个计数器。计数器在函数 addStepLog 中递增。一段时间后,当在 afterEachScenarioStep 函数中调用相同的计数器变量时,该值被初始化为 0。请注意,@AfterStep 是一个黄瓜注释(使用 cucumber-java 4.2.5)。下面是我的代码。

public class Reporter {

      private final Object lockObject = new Object();
      private int counter;
      private List<String> stepLog;

      public Reporter() {
        stepLog = new ArrayList<>();
        counter = 0;
      }

      public void addStepLog(String message) {
        synchronized (lockObject) {
          this.counter++;
          stepLog.add(message);
        }
        System.out.println("Counter Value in addStep " + this.counter);
      }

     @AfterStep
      public void afterEachScenarioStep(Scenario scenario) {
        System.out.println("Value of Counter " + this.counter); // The value of counter is 0 here.
        if (stepLog.size() > 0) {
          System.out.println(counter++);
          synchronized (lockObject) {
            stepLog.forEach(scenario::write);
          }
        }
        scenario.embed(screenshotArray, "image/png");
      }

arryList 的大小为 0,计数器也重新初始化为 0。我很确定 cucumber 在做一些有趣的事情。

我只从登录 class 创建了一个 Reporter 实例。记者没有在其他任何地方使用。

public class Login {

  private JsonParser jsonParser = new JsonParser();
  Reporter reporter = new Reporter();

  public void launchBrowser(String device) {
    reporter.addStepLog("Launched the Browser.");
    reporter.addStepLog("Launched the Browser.");
    driver(device).launchUrl(jsonParser.getValue(device, "url"));
  }

  public void clickForgotPassword(String device) {
    reporter.addStepLog("This is a dummy Step");
    reporter.addStepLog("This is a dummy Step2");
    reporter.addStepLog("This is a dummy Step3");
    reporter.addStepLog("This is a dummy Step4");
    driver(device).click("account.forgetPassword");
  }

Grasshopper 的评论是正确答案:cucumber-jvm 破坏并重新创建每个特征的 "world"(包括所有步骤和粘合对象)。因此,您将获得每个功能的 Reporter 的新实例。

这里列出了一些解决方法:https://automationpanda.com/2017/03/03/cucumber-jvm-global-hook-workarounds/

静态变量是最简单的解决方法。