3

我正在尝试在我的步骤定义中使用 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 进行构造函数注入吗?

4

2 回答 2

5

从 cucumber-guice 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.createScenarioModule(), new MyModule());
       }
}

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

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

于 2017-01-12T03:46:17.347 回答
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 模块的属性。例如..

guiceModule=com.felix.cucumber.MyModule

于 2012-09-13T13:49:27.847 回答