重新初始化变量的值
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/
静态变量是最简单的解决方法。
我有一个 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/
静态变量是最简单的解决方法。