Java 在没有main方法的情况下为基本字段注入配置guice

Java 在没有main方法的情况下为基本字段注入配置guice,java,guice,Java,Guice,我最近一直在研究guice,需要在我的自动化框架中进行一些现场注入。例如,我有一个EnvironmentSetter类,我想将它作为一个单例注入到其他各种类中 1) 我没有一个标准的main方法,所以我正在努力解决如何正确引导guice。我正在使用testNG,因此我尝试使用静态块引导,如下所示: public class TestExecutionListener implements IExecutionListener { private static final Logger L

我最近一直在研究guice,需要在我的自动化框架中进行一些现场注入。例如,我有一个EnvironmentSetter类,我想将它作为一个单例注入到其他各种类中

1) 我没有一个标准的main方法,所以我正在努力解决如何正确引导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,我需要什么才能有效地使用它

环境设置器类:

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的博客中阅读更多关于此的信息: