Dependency injection cucumber的多个ObjectFactory实例

Dependency injection cucumber的多个ObjectFactory实例,dependency-injection,cucumber,cucumber-java,cucumber-junit,picocontainer,Dependency Injection,Cucumber,Cucumber Java,Cucumber Junit,Picocontainer,我编写了一组用于测试自定义框架的功能文件,我希望能够测试框架接口的特定实现。我想用不同的实现运行很多特性 为此,我创建了一个自定义ObjectFactory,并使用PicoContainer依赖项注入传递实现。我将这个工厂添加到cucumber.properties文件中,它工作得很好。唯一的问题是-如果我有多个实现集要测试怎么办 我可以创建几个ObjectFactory,但是如何在不同的工厂中多次运行测试呢?是否可以使用注释或类似的方法将ObjectFactory实现传递给Runner类?我使

我编写了一组用于测试自定义框架的功能文件,我希望能够测试框架接口的特定实现。我想用不同的实现运行很多特性

为此,我创建了一个自定义ObjectFactory,并使用PicoContainer依赖项注入传递实现。我将这个工厂添加到cucumber.properties文件中,它工作得很好。唯一的问题是-如果我有多个实现集要测试怎么办


我可以创建几个ObjectFactory,但是如何在不同的工厂中多次运行测试呢?是否可以使用注释或类似的方法将ObjectFactory实现传递给Runner类?我使用JUnit runner运行特性,如果我可以在不同的工厂中使用其中的几个特性,我认为它应该可以工作。但是,我找到的唯一指定ObjectFactory的选项是cucumber.options文件,它是一个模块的文件…

目前,cucumber中不可能使用多个对象工厂。作为一种解决方法,您可以实现一个对象工厂,根据环境变量委托给不同的对象工厂

您还可以考虑使用<代码>黄瓜Spring <代码>而不是<代码>黄瓜PICO/<代码>作为代码>黄瓜Spring < /Cord>可以从STEP定义中获取Spring上下文配置注释。如果您的项目结构如下所示,则可以通过最少的配置完成此操作:

 | - runners 
 | | - CucumberConfigATest.java // @CucumberOptions(glue="steps", extraGlue="config.a") 
 | | - CucumberConfigBTest.java // @CucumberOptions(glue="steps", extraGlue="config.b")
 | - steps
 | | - SomeSteps.java
 | | - MoreSteps.java
 | - config
 | | - a
 | | | - StepsWithContextConfigA.java
 | | - b
 | | | - StepsWithContextConfigB.java

@mpkorstanje也提供了一个我想到的答案。如果有人需要实施示例,请参见:

@RunWith(Cucumber.class)
@CucumberOptions(features="src/test/resources")
public class MyRunner {

    @BeforeClass
    public static void setup(){
        System.setProperty(EventProcessorPicoFactory.EVENT_BUS_HANDLER, IUserECNDataHandler.class.getName());
    }

}

public class MyFactory {
    public MyObject build() {
        String type = System.getProperty("my.property.name");
        switch (type) {
            case  "my.value":
                return new MyObject();
            default:
                throw new IllegalArgumentException("not implemented");
            }
        }   

    }

我对env变量和工厂也有同样的想法。不幸的是,我没有时间尝试cucumber spring,否则我宁愿采用这种方式——它看起来更干净。cucumber还支持JUnits在类注释之前和之后。你不需要照看黄瓜。如果你使用的是它的最新版本(我想>2.0.0)。我的意思是@BeforeClass,但是谢谢,我没有意识到我可以在那里使用它。试图将其放入初始化块中,但它似乎从未被调用-我想,我需要进一步了解JUnit如何实例化测试类初始化依赖于运行程序。Cucumber runner没有实例化测试类。但看起来我错了。Cucumber目前在启动对象工厂后很好地调用@BeforeClass。这是实现中的一个bug。