TestNG-在GUI模块中访问ITestContext

TestNG-在GUI模块中访问ITestContext,testng,guice,Testng,Guice,我试着按照这个问题去做 考虑一下这一点: public class TestParentModule extends AbstractModule { private ITestContext iTestContext; public TestParentModule(ITestContext iTestContext){ this.iTestContext = iTestContext; } @Override protected

我试着按照这个问题去做

考虑一下这一点:

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());
    }
}
Parent module called
configure is called :: Test1
configure is called :: Test1
configure is called :: Test1
套件

<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>
输出::

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());
    }
}
Parent module called
configure is called :: Test1
configure is called :: Test1
configure is called :: Test1
有趣的是,它每次都注入相同的ITestContext实例?这不是TestNG中的一个bug吗

我希望我能看到

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

如何在GuiceModule中访问ITestContext?

TestParentModule将ITestContext明确绑定到特定实例。此外,ParentModule仅被调用一次。所以它基本上要注入相同的实例。不确定它是否是一个bug。可以按照他们的设计

    @Override
    protected void configure() {
        System.out.println("Parent module called");
        bind(ITestContext.class).toInstance(iTestContext);
    }
正如Jens在评论中指出的,使用
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);
    }

}
公共类ModuleFactory实现IModuleFactory{
@凌驾
公共模块createModule(ITestContext ITestContext,类aClass){
返回新的TestModule(iTestContext);
}
}
公共类TestModule扩展了AbstractModule{
私有ITestContext ITestContext;
公共测试模块(ITestContext ITestContext){
this.iTestContext=iTestContext;
}
@凌驾
受保护的void configure(){
//用iTestConext做点什么
绑定(ITestContext.class).toInstance(ITestContext);
}
}

TestNG的常见行为是至少为整个套件共享ITestContext。人们使用它在具有ITestContext属性的测试之间共享信息。您可以使用中所述的依赖项注入,但我建议不要干扰底层基础结构。