Java 正在重新初始化的变量的值

Java 正在重新初始化的变量的值,java,cucumber,cucumber-java,Java,Cucumber,Cucumber Java,我有一个班级记者。在构造函数中,我初始化了一个计数器。计数器在函数addStepLog中递增。在afterEachScenarioStep函数内调用相同的计数器变量后,该值将被初始化为0。请注意@AfterStep是cucumber注释(使用cucumberJava4.2.5)。下面是我的代码 public class Reporter { private final Object lockObject = new Object(); private int count

我有一个班级记者。在构造函数中,我初始化了一个计数器。计数器在函数addStepLog中递增。在afterEachScenarioStep函数内调用相同的计数器变量后,该值将被初始化为0。请注意@AfterStep是cucumber注释(使用cucumberJava4.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");
      }

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

这里列出了一些解决方法:


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

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

这里列出了一些解决方法:


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

我敢打赌第二个报告器与第一个报告器不一样……因此,除了构造函数之外,你在哪里重置这些变量?您是否100%确定报告者的实例始终是相同的?如果是,我们就丢失了代码。如果没有这样的重置代码,您每次都在创建新的Reporter实例。但是这些投票试图告诉你,为了给你一个答案,这里需要更多的信息。cucumber
AfterStep
annotation:可能会注释掉它。它散发着特殊流动的气息。我还猜想登录被创建了不止一次,使用了序列化,启动了几个线程,重置了单元测试等等。Cucumber将在运行每个场景之前重新初始化所有步骤和钩子类。Reporter类是一个钩子类,因此list和int变量分别为空和0。你可以使它们保持静态,但在多线程并行运行环境中,祈祷好运。你可以通过实现EventListener接口来创建一个自定义插件。我打赌第二个报告器和第一个报告器不一样……所以除了构造函数之外,你在哪里重置这些变量?您是否100%确定报告者的实例始终是相同的?如果是,我们就丢失了代码。如果没有这样的重置代码,您每次都在创建新的Reporter实例。但是这些投票试图告诉你,为了给你一个答案,这里需要更多的信息。cucumber
AfterStep
annotation:可能会注释掉它。它散发着特殊流动的气息。我还猜想登录被创建了不止一次,使用了序列化,启动了几个线程,重置了单元测试等等。Cucumber将在运行每个场景之前重新初始化所有步骤和钩子类。Reporter类是一个钩子类,因此list和int变量分别为空和0。你可以使它们保持静态,但在多线程并行运行环境中,祈祷好运。你可以通过实现EventListener接口来创建一个自定义插件。我确实采纳了Grasshopper的建议,实现了一个自定义接口。尽管静态是一种更简单的方法,但我无法接受使用静态的方法,这似乎是错误的……我确实采纳了Grasshopper的建议,实现了一个自定义接口。尽管静态是一种更简单的方法,但我无法接受使用静态,这似乎是错误的。。。
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");
  }