我正在尝试在步骤定义中使用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进行构造函数注入?
答案 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)
MyModule
和MyStepDefs
类很好。 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