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);
}
}
我试着按照这个问题去做。
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);
}
}