2012-09-13 78 views
2

我想在我的步骤定义中使用DI。我有一个模块,配置黄瓜guice

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) 

我也应该使用提供商的建设者注射?

回答

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

3

黄瓜,吉斯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源到这个新类的完全限定名。 cucumber.properties应该像以前一样在src/main/resources(或根据您的要求src/test/resources)。

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

+0

在我来说,我只是用'cucumber.properties'并设置 'guice.injector源= com.xxx.yyy.inject.MyInjectorSource'内'的src /测试/ resources' –

+0

呀对不起 - 我不小心写了“ guice.properties'在我的答案的后半部分。我现在纠正了它。 –