Search code examples
javaseleniumcucumberguiceguice-3

Google Guice trouble overwriting my hashmap for each test


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


Solution

  • I figured it out - needed to add @ScenarioScoped in my steps class.