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

时间:2018-02-04 17:54:44

标签: java guice

我最近一直在研究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);
        }
    }
}

2 个答案:

答案 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