Инъекция зависимости - Пико-контейнер для огурца - PullRequest
0 голосов
/ 01 июля 2018

Мне трудно понять и использовать инъекцию зависимости в моей ситуации. Я хочу использовать Пико-контейнер (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

Затем мне нужно все правильно подключить, чтобы все классы могли использовать драйвер, ловушки и POM. Cucumber не поддерживает наследование, поэтому лучше использовать интерфейсы или Dependency Injection (Pico Container). Я не знаю, как это сделать, и я изучал в Интернете, я просто не могу обернуть мой бедный мозг вокруг всего этого.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вас может заинтересовать мое сообщение в блоге, где я использую Pico Container для обмена состоянием между двумя различными классами шагов Cucumber-JVM, http://www.thinkcode.se/blog/2017/04/01/sharing-state-between-steps-in-cucumberjvm-using-picocontainer

0 голосов
/ 02 июля 2018

Возможно, вам не удастся реализовать наследование , но вы можете использовать конструкторы в классе определений шагов для передачи ссылки на объект драйвера из одного класса в другой.

  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 с контекстом. Именно здесь пико-контейнер играет свою магическую роль, связывая объект драйвера класса определения шага с другим классом.

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();

    }

Теперь вы можете проявить творческий подход и соответствующим образом организовать объекты вашей страницы. Я собрал и создал все классы объектов моей страницы внутри класса-обертки, который возвращает объект веб-драйвера. Вы можете видеть в коде, я обращаюсь к altoroMutual классу pageObject из test объекта.

Убедитесь, что вы используете maven для управления всеми dev-зависимостями. Следующие зависимости должны добавить пико-контейнер в ваш проект.

        <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...