配置黄瓜 - guice

时间:2012-09-13 10:41:39

标签: java guice cucumber-jvm

我正在尝试在步骤定义中使用DI。我有一个模块,

public class MyModule extends AbstractModule
{
    private final static MyInterface INSTANCE = new MyInterfaceImpl();

    @Override
    protected void configure()
    {
        bind(MyInterface.class).toInstance(INSTANCE);
    }
}

并希望在步骤定义的构造函数中注入此实例。

public class MyStepDefs
{
    private final MyInterface instance;

    @Inject
    public MyStepDefs(MyInterface instance)
    {
        this.instance = instance
    }
}

我想我需要使用cucumber-guice.properties文件配置GuiceFactory,但我真的不知道这是什么?目前我得到的错误是,

java.lang.NoClassDefFoundError: javax/inject/Singleton
    at cucumber.runtime.java.guice.GuiceFactory$CucumberModule.configure(GuiceFactory.java:86)

我是否应该使用Provider进行构造函数注入?

2 个答案:

答案 0 :(得分:4)

从黄瓜gu1 v1.2.4开始,这种情况略有改变。首先,配置文件已更改其名称,现在为cucumber.properties

其次,现在除了构建模块之外,还必须构建一个扩展cucumber.runtime.java.guice.InjectorSource的类,并将其设置为属性文件中guice.injector-source的值。所以除了你已经创建的两个类之外,你还必须创建第三个类:

public class MyInjectorSource implements InjectorSource {

       @Override
       public Injector getInjector() {
            return Guice.createInjector(Stage.PRODUCTION, CucumberModules.SCENARIO, new MyModule());
       }
}

然后在cucumber.properties中将guice.injector-source设置为此新类的完全限定名称。 cucumber.properties应该像以前一样src/main/resources(或src/test/resources,视您的要求而定)。

当然,您仍然需要pom.xml文件中的依赖项。

答案 1 :(得分:2)

MyModuleMyStepDefs类很好。 NoClassDefFoundError是由于未将最新版本的Guice添加为依赖项而导致的。我添加了这个,

<dependency>
  <groupId>com.google.inject</groupId>
  <artifactId>guice</artifactId>
  <version>3.0</version>
</dependency>

到我的POM.xml

cucumber-guice.properties文件位于src/main/resources文件夹中。此文件由GuiceFactory类读取,并且应包含要使用的Guice模块的属性。 EG ..

guiceModule=com.felix.cucumber.MyModule