参考这篇文章:Cucumber: no backend found when running from Spring Boot jar
我正在尝试在一个实时的Spring Boot应用程序中完整地运行Cucumber。我目前有一个POC应用程序,使用上述帖子中的代码来创建Cucumber Runtime,并运行一个引用Bean的简单Feature/Steps类:
服务:
public void testFeature(){
RuntimeOptions runtimeOptions = new RuntimeOptions(new ArrayList<String>(asList("--glue", "org.bdd.poc", "--no-dry-run", "--monochrome", "classpath:features")));
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
ResourceLoader resourceLoader = new CustomMultiLoader(classLoader);
ClassFinder classFinder = new ResourceLoaderClassFinder(resourceLoader, classLoader);
Runtime runtime = new Runtime(resourceLoader, classFinder, classLoader, runtimeOptions);
try {
runtime.run();
} catch (IOException e) {
e.printStackTrace();
}
}
演示步骤:
(no class annotation)
public class DemoSteps {
@Autowired
private MyBean bean;
public DemoSteps(){
System.err.println("STEP INIT");
}
@Given("a proof of concept")
public void givenAPOC(){
}
@When("doing a demo")
public void whenDemo(){
}
@Then("it should talk to a bean")
public void thenItShouldTalkToABean(){
this.bean.poke();
}
}
Bean:
@Component
public class MyBean {
public void poke(){
System.err.println("I'VE BEEN POKED! THE PAIN!");
}
}
DemoSteps.java类有一个使用@Autowired的类字段,但它既没有填充bean引用,也没有在DemoSteps构造之后失败。调试时我看到Spring bean工厂被用于创建步骤实例,但是没有任何关于自动装配的信息。我猜想为了将主SpringContext连接到某个地方,可以采用以下两种方式之一:
- 适当的Backend实现
- 适当的Glue实现
当前使用的是Spring Boot 2.3.0和Cucumber 2.4.0,按照“spring-boot-maven-plugin”配置进行拆包。
cucumber.runtime.java.JavaBackend
实例,并使用自定义实现的cucumber.api.java.ObjectFactory
。仅从接口上看,它似乎是我与SpringContext之间的桥梁。然而,几乎可以看出,我需要创建自己的作用域来处理步骤定义,或者扩展现有的cucumber.runtime.java.spring.SpringFactory
。需要进行一些实验。 - Joe Kennedy