变量值被重新初始化

时间:2019-03-14 15:18:24

标签: java cucumber cucumber-java

我有一个记者班。在构造函数内部,我已经初始化了一个计数器。计数器在函数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。我敢肯定,黄瓜在做些有趣的事情。

我从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");
  }

1 个答案:

答案 0 :(得分:2)

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

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

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