我有一个记者班。在构造函数内部,我已经初始化了一个计数器。计数器在函数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");
}
答案 0 :(得分:2)
Grasshopper的评论是正确的答案:cucumber-jvm
破坏并重新创建每个功能的“世界”(包括所有步骤和粘合对象)。因此,您将为每个功能获得Reporter
的新实例。
此处列出了一些解决方法:https://automationpanda.com/2017/03/03/cucumber-jvm-global-hook-workarounds/
静态变量是最简单的解决方法。