TestNG - Доступ к ITestContext в модуле Guice - PullRequest
0 голосов
/ 14 апреля 2019

Я пытался сделать согласно этому вопросу.

Есть ли способ ввести ITestContext из TestNg в модуль guice?

Учтите это:

public class TestParentModule extends AbstractModule {

    private ITestContext iTestContext;

    public TestParentModule(ITestContext iTestContext){
        this.iTestContext = iTestContext;
    }

    @Override
    protected void configure() {
        System.out.println("Parent module called");
        bind(ITestContext.class).toInstance(iTestContext);
    }

}

public class TestModule extends AbstractModule {

    @Inject
    private ITestContext iTestContext;

    @Override
    protected void configure() {
        System.out.println("configure is called :: " + iTestContext.getName());
    }
}

Люкс

<suite name="My suite" parent-module="com.mypackage.guice.TestParentModule">
    <test name="Test1" >
        <classes>
            <class name="com.mypackage.SampleTest"/>
        </classes>
    </test>

    <test name="Test2" >
        <classes>
            <class name="com.mypackage.SampleTest"/>
        </classes>
    </test>

    <test name="Test3" >
        <classes>
            <class name="com.mypackage.SampleTest"/>
        </classes>
    </test>

</suite>

Тестовый класс помечен

@Guice(modules = TestModule.class)

Выход ::

Parent module called
configure is called :: Test1
configure is called :: Test1
configure is called :: Test1

Интересно, он каждый раз вводит один и тот же экземпляр ITestContext? Разве это не ошибка в TestNG?

Я надеялся, что увижу

Parent module called
configure is called :: Test1
configure is called :: Test2
configure is called :: Test3

Как я могу получить доступ к ITestContext в GuiceModule?

1 Ответ

0 голосов
/ 15 апреля 2019

TestParentModule четко связывает ITestConext с конкретным экземпляром. Также ParentModule вызывается только один раз. Так что это в основном собирается внедрить тот же экземпляр. Не уверен, что это ошибка. Может быть в соответствии с их дизайном!

    @Override
    protected void configure() {
        System.out.println("Parent module called");
        bind(ITestContext.class).toInstance(iTestContext);
    }

Как указал Дженс в комментарии, использование IModuleFactory решит вашу проблему.

public class ModuleFactory implements IModuleFactory {

    @Override
    public Module createModule(ITestContext iTestContext, Class<?> aClass) {
        return new TestModule(iTestContext);
    }

}

public class TestModule extends AbstractModule {

    private ITestContext iTestContext;

    public TestModule(ITestContext iTestContext){
        this.iTestContext = iTestContext;
    }

    @Override
    protected void configure() {
        //do something with iTestConext
        bind(ITestContext.class).toInstance(iTestContext);
    }

}
...