Значение переинициализируемой переменной - PullRequest
0 голосов
/ 14 марта 2019

У меня есть класс Reporter. Внутри конструктора я инициализировал счетчик. Счетчик увеличивается внутри функции 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. Я уверен, что огурец делает что-то смешное.

Я создал только один экземпляр Reporter из класса Login. Репортер больше нигде не используется.

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 Ответ

2 голосов
/ 24 марта 2019

Комментарий Кузнечика - правильный ответ: cucumber-jvm разрушает и заново создает «мир» (который включает в себя все шаги и объекты склеивания) для каждой функции.Поэтому вы получаете новый экземпляр Reporter для каждой функции.

Здесь перечислены некоторые обходные пути: https://automationpanda.com/2017/03/03/cucumber-jvm-global-hook-workarounds/

Статические переменные - самый простой обходной путь.

...