I recently switched over to Google Guice and now my results are being overwritten for each test instead of adding all tests. I am using a hashmap to collect the pass and fails of each test but instead of collecting data for each test it overwrites the previous one. I am using my injects in my constructor. Using Selenium, Cucumber, Java and Eclipse.
AbstractDriver
public abstract class AbstractDriver {
protected abstract WebDriver createDriver();
public abstract WebDriver getDriver(); }
Driver
public class Driver extends AbstractDriver {
protected WebDriver driver;
private ChromeDriverService ChromeService;
protected Messages msg = new Messages();
@Override
protected WebDriver createDriver() {
try {
System.setProperty(CHROME.getEXE(), CHROME.getPath());
System.setProperty(ChromeDriverService.CHROME_DRIVER_SILENT_OUTPUT_PROPERTY, "true");
ChromeService = new ChromeDriverService.Builder()
.usingDriverExecutable(new File(CHROME.getPath()))
.usingPort(CHROME.getNodes())
.build();
}catch(IllegalStateException e) {
msg.switchMessages("DriverErrorMessage");
}
return driver = new ChromeDriver(ChromeService,CHROME.getCHROME_DC());
}
@Override
public WebDriver getDriver() {
if (driver == null) {
this.createDriver();
}
return driver;
}
}
Driver Base
@ScenarioScoped
public class DriverBase {
public WebDriver driver = new Driver().getDriver();
}
Page Base
public class PageBase {
protected DriverBase web;
public PageBase(DriverBase web) {
this.web = web;
PageFactory.initElements(web.driver, this);
}
Page Object
public class PageObject extends PageBase {
/** NOTES -> Constructor*/
@Inject
public PageObject(DriverBase web) {
super(web);
}
public String getTitle() {
web.driver.get("https://stackoverflow.com/");
String title = web.driver.getTitle();
return title;
}
public String getGoogleTitle() {
web.driver.get("https://google.com/");
String title = web.driver.getTitle();
return title;
}
}
Steps
public class Steps {
private DriverBase web;
PageObject pageobj;
Results result;
String results = null;
@Inject
Steps( DriverBase web,PageObject pageobj){
this.web = web;
this.pageobj= pageobj;
}
@Then("Check title")
public void test() throws IOException, ParseException {
String title = pageobj.getTitle();
if(title.equals("stackoverflow"))
{
results = "pass";
}else if(!title.equals("stackoverflow")) {
results = "fail";
}
result.createResult(results);
}
@Then("Check Google title")
public void test2() throws IOException, ParseException {
String title = pageobj.getGoogleTitle();
if(title.equals("google"))
{
results = "pass";
}else if(!title.equals("google")) {
results = "fail";
}
result.createResult(results);
}
Result
public class Results {
ArrayList<Map<String, String>> PlanResult = new ArrayList<>();
public void createResult(String result ) throws IOException,ParseException {
Map<String, String> CaseResult= new HashMap<String, String>(){{put("result", result) ;}};;
PlanResult.add(CaseResult);
System.out.println("Case Result: " + PlanResult);
}
}
The method that collects the Pass or Fails and stores them in an array. The hashmap field is PlanResult.
ArrayList> PlanResult = new ArrayList<>();
Also tried @Singleton
I figured it out - needed to add @ScenarioScoped in my steps class.