Java 在没有main方法的情况下为基本字段注入配置guice
我最近一直在研究guice,需要在我的自动化框架中进行一些现场注入。例如,我有一个EnvironmentSetter类,我想将它作为一个单例注入到其他各种类中 1) 我没有一个标准的main方法,所以我正在努力解决如何正确引导guice。我正在使用testNG,因此我尝试使用静态块引导,如下所示:Java 在没有main方法的情况下为基本字段注入配置guice,java,guice,Java,Guice,我最近一直在研究guice,需要在我的自动化框架中进行一些现场注入。例如,我有一个EnvironmentSetter类,我想将它作为一个单例注入到其他各种类中 1) 我没有一个标准的main方法,所以我正在努力解决如何正确引导guice。我正在使用testNG,因此我尝试使用静态块引导,如下所示: public class TestExecutionListener implements IExecutionListener { private static final Logger L
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,我需要什么才能有效地使用它
环境设置器类:
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);
}
}
}
您应该添加在
createInjector
方法中创建的模块,而不是新模块()代码>
此外,仅引导它不会使它自动在测试类中的任何地方注入所有字段,要在测试时注入,您可以使用新的注入器并注入测试类的成员injectMembers(this)
,其中this
将引用您的测试实例,因此必须在某些设置块上执行。
查看guice上关于如何在测试时正确增强它的文档=>您应该添加在createInjector
方法中创建的模块,而不是新模块()代码>
此外,仅引导它不会使它自动在测试类中的任何地方注入所有字段,要在测试时注入,您可以使用新的注入器并注入测试类的成员injectMembers(this)
,其中this
将引用您的测试实例,因此必须在某些设置块上执行。
查看guice上关于如何在Test=>上正确引导它的文档如果您使用的是TestNG,那么使用注释guiceModule有一种更简单的方法来实现这一点。基本上,TestNG为您进行引导,您只需在注释中提及GUI模块名称。例如:
@Test(guiceModule = GuiceExampleModule.class)
public class GuiceTest {
@Inject
ExternalDependency dependency;
@Test
public void singletonShouldWork() {
Assert.assertTrue(true, dependency.shouldExecute());
}
}
在Cedric的博客文章中阅读更多关于这方面的信息:如果您使用的是TestNG,那么有一种更简单的方法可以使用annotation guiceModule来实现这一点。基本上,TestNG为您进行引导,您只需在注释中提及GUI模块名称。例如:
@Test(guiceModule = GuiceExampleModule.class)
public class GuiceTest {
@Inject
ExternalDependency dependency;
@Test
public void singletonShouldWork() {
Assert.assertTrue(true, dependency.shouldExecute());
}
}
请在Cedric的博客中阅读更多关于此的信息: