代码之家  ›  专栏  ›  技术社区  ›  snikt

依赖性注射-黄瓜皮碗

  •  1
  • snikt  · 技术社区  · 7 年前

    在我的情况下,我很难理解和利用依赖注入。我想用皮科容器( https://cucumber.io/blog/2015/07/08/polymorphic-step-definitions )。

    这是我的情况……我目前有一个包含我所有硒元素的步骤定义类,它太大了:

    public class StepDefinitions{
        public static WebDriver driver; // a driver is returned here from a static Driver Factory Class
        LoginPage loginPage = new LoginPage(driver); //Page Object Model(s)
    
        @Before("setup")
        @After //screen snapshot
        @After("destroy")
        @Given //many methods with this tag
        @When  //many methods with this tag
        @Then  //many methods with this tag
    }
    

    现在,我希望有一个类包含我的驱动程序、POM和钩子:

    public static WebDriver driver; //driver is returned from a static Driver Factory Class
    LoginPage loginPage = new LoginPage(driver); //Page Object Model(s)
    
     @Before("setup")
     @After
     @After("destroy")
    

    另一个类包含 @Given ,一个包含我的 @When 和一个包含我的 @Then

    然后我需要把一切都连接好,所以 所有类 可以使用螺丝刀、钩子和绒球。黄瓜不支持继承,所以接口或依赖项注入(pico容器)是解决问题的方法。我不知道如何做到这一点,而且我在网上学习过,我只是不能把我可怜的大脑都包起来。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Thomas Sundberg    7 年前

    您可能会对我的博客文章感兴趣,我使用pico容器在两个不同的cumber jvm步骤类之间共享状态, http://www.thinkcode.se/blog/2017/04/01/sharing-state-between-steps-in-cucumberjvm-using-picocontainer

        2
  •  2
  •   Manmohan_singh    7 年前

    您可能无法实现 继承 但是你可以用 施工人员 要传递的步骤定义类 驱动程序对象引用 从一个班到另一个班。

    1. 创建一个基础/基础类,初始化驱动程序对象/页面对象类。使用@before注释定义安装程序,使用@after定义拆卸方法。

    public class Step_Def_Base {
    
        public static webDriverCreator test;
            @Before
            public void printScenario(Scenario scenario) {
                test = new webDriverCreator(this.getClass().getSimpleName());
                String className = this.getClass().getCanonicalName();
                System.out.println("********************************************************");
                System.out.println("Scenario: " + scenario.getName());
                System.out.println("********************************************************");
            }
    
            @After
            public void screenShotAndConsoleLog(Scenario result) {
                  test.takescreenshot.takeScreenShotOnException(result);
                if (!(result.getStatus().contains("pass"))) {
                    throw new RuntimeException(result.getName() + " got failed");
                }
                test.closeBrowserSession();
            }
    
    
    
    }
    

    1. 在步骤定义类中,创建一个构造函数并用上下文实例化BaseFoundation对象。在这里,pico容器扮演着将步骤定义类的驱动程序对象与另一个类链接起来的神奇角色。

    public class StepDefs_AltoroMutualLoginPage  {
    
        private Step_Def_Base contextStep;
        private webDriverCreator test;
        public StepDefs_AltoroMutualLoginPage(Step_Def_Base contextStep) {
            // TODO Auto-generated constructor stub
            this.contextStep = contextStep; // <-- This is where pico-containers starts working
            test = contextStep.test; // <-- Linking your driver object reference from the point where it is instantiated , i.e the base foundation class
        }
    
        @Given("^I am on test fire login page \"([^\"]*)\"$")
        public void alotoroMutualLoginPage(String url) {
    
            test.launchApplication(url);
            test.altoroMutual.launchLoginLink();
            test.altoroMutual.verifyUserIsOnLoginPage();
    
        }
    

    现在您可以获得创造性,并相应地组织页面对象。我在返回Web驱动程序对象的包装类中聚合并实例化了所有的页面对象类。你可以在代码中看到,我正在访问 altoroMutual PageObject类来自 test 对象。

    确保您正在使用 马文 管理所有开发依赖项。以下依赖项将在您的项目中添加pico容器。

            <dependency>
                 <groupId>info.cukes</groupId>
                 <artifactId>cucumber-picocontainer</artifactId>
                  <version>1.2.5</version>
               <scope>test</scope>
            </dependency>
            <dependency>   
                <groupId>org.picocontainer</groupId>  
                 <artifactId>picocontainer</artifactId>
                 <version>2.14.3</version>
            </dependency>