我最近一直在研究guice,并且需要在我的自动化框架中进行一些现场注入。例如,我有一个EnvironmentSetter类,我想将其作为单例注入其他各种类。
1)我没有标准的主要方法,所以我正在努力正确地引导guice。我正在使用testNG,因此我尝试使用静态块进行引导,如下所示:
public class TestExecutionListener implements IExecutionListener {
private static final Logger LOG = LogManager.getLogger(TestExecutionListener.class);
static {
Bootstrapper.BootStrapGuiceDI();
}
@Inject
EnvironmentSetter env;
@Override
public void onExecutionStart() {
LOG.debug("Starting test run!");
env.generateEnvironmentProperties();
}
@Override
public void onExecutionFinish() {
LOG.debug("Finished test run!");
}
}
我还创建了以下内容:
public class EnvironmentSetterModule extends AbstractModule {
@Override
protected void configure() {
bind(EnvironmentSetter.class);
}
}
这就是我从静态块调用的内容:
public static void BootStrapGuiceDI() {
LOG.debug("Bootstrapping");
Injector injector = Guice.createInjector(new Module());
EnvironmentSetter env = injector.getInstance(EnvironmentSetter.class);
}
在这种情况下,我注入的EnvironmentSetter env仍为null,为了有效地使用它,我需要什么?
EnvironmentSetter类:
public class EnvironmentSetter implements IEnvironmentPopulator {
private static final Logger LOG = LogManager.getLogger(EnvironmentSetter.class);
PropertyProvider properties = PropertyProvider.INSTANCE;
public EnvironmentSetter() {
}
public void generateEnvironmentProperties() {
Properties props = new Properties();
properties.getAllProperties().forEach((k,v) -> props.setProperty(k,v));
try {
File f = new File("target\\allure-results\\environment.properties");
f.getParentFile().mkdirs();
f.createNewFile();
props.store(new FileOutputStream(f), "Allure Environment Properties");
} catch(IOException ioe) {
LOG.fatal(ioe);
}
}
}
答案 0 :(得分:3)
您应该使用createInejector
方法而不是new Module();
添加您创建的模块。
public static void BootStrapGuiceDI() {
LOG.debug("Bootstrapping");
// Injector injector = Guice.createInjector(new Module()); // use your module (EnvironmentSetterModule )
// Now, guice will be able to "see" your class
Injector injector = Guice.createInjector(new EnvironmentSetterModule());
EnvironmentSetter env = injector.getInstance(EnvironmentSetter.class);
}
此外,只有引导它才会使它自动注入测试类中的所有字段,在测试时注入你可以使用新的Injector
并注入测试类injectMembers(this)
的成员,其中this
将引用您的测试实例,因此必须在某个安装块上执行。
查看关于如何在Test =>上正确提升它的guice的文档。 Guice BoundFields
答案 1 :(得分:2)
如果您使用的是TestNG,使用注释guiceModule可以采用更简单的方法。基本上,TestNG为您做引导,您需要做的就是在注释中提到Guice模块名称。示例:
@Test(guiceModule = GuiceExampleModule.class)
public class GuiceTest {
@Inject
ExternalDependency dependency;
@Test
public void singletonShouldWork() {
Assert.assertTrue(true, dependency.shouldExecute());
}
}
在Cedric的博文中了解更多相关信息:TestNG and Guice: a match made in heaven