变量重新初始化的价值

问题描述 投票:0回答:1

我有一个班级记者。在构造函数内部,我初始化了一个计数器。计数器在函数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");
      }

arrayList的大小为0,计数器也初始化为0.我很确定黄瓜正在做一些有趣的事情。

我从Login类中只创建了一个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");
  }
java cucumber cucumber-java
1个回答
2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.