TestNG - 在 Guice 模块中访问 ITestContext

TestNG - Accessing ITestContext in Guice Module

我试着按照这个问题去做。

Is there a way to inject ITestContext from TestNg to guice module?

考虑一下:

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>

测试 class 注释为

@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

如何访问 GuiceModule 中的 ITestContext?

TestParentModule 清楚地将 ITestConext 绑定到特定实例。 ParentModule 也只被调用一次。所以它基本上是要注入相同的实例。不确定这是否是一个错误。可以按照他们的设计!

    @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);
    }

}