我可能对 Cucumber 如何与 Spring 一起工作的机制有点了解,但我目前的理解是,如果类路径上有一个类,其中包含一些 Cucumber 钩子,Cucumber Spring 引擎会将该类/bean 添加到春天的背景。例如
class MySteps(val someDep: SomeDep) {
@Before
fun initialize() {
}
}
有没有办法根据某些条件禁用此类的实例化,例如类路径上是否存在
SomeDep
类?我正在考虑与@ConditionalOnClass
进行类比。理想情况下,我希望这个注释能够开箱即用,但显然事实并非如此。
用例是
MySteps
位于公司范围内的通用 Cucumber 库中(我可以对其进行修改),对于类路径上具有 SomeDep
的应用程序来说,它正是有意义的。
Cucumber 发现了“胶水路径”上的台阶。这通常默认整个类路径。粘合路径是一个包名称列表,Cucumber 应在其中查找步骤定义、挂钩等。
如果您将 Cucumber 与 JUnit 5 一起使用,您可以像通过
cucumber.glue
属性一样配置它:
import org.junit.platform.suite.api.ConfigurationParameter;
import org.junit.platform.suite.api.IncludeEngines;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PROPERTY_NAME;
import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME;
@Suite
@IncludeEngines("cucumber")
@SelectPackages("io.cucumber.skeleton")
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty")
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "io.cucumber.skeleton")
public class RunCucumberTest {
}
没有其他机制可以控制哪些步骤定义可用。
请注意,人们过去曾尝试创建通用步骤库。 最引人注目的是阿斯拉克本人,但这并没有带来好的小黄瓜。
请考虑仅共享 API。如果足够丰富,步骤定义应该是一个非常薄的包装器。这为编写和实施测试的人员提供了更大的灵活性,因为他们可以使用更具表现力的上下文敏感语言。从维护的角度来看,用 Java 开发 API 也比用 Gherkin 开发一组公司范围的步骤定义更容易。除此之外,您还可以使用该 API 进行其他测试。
对于你的 API,你可能仍然想在每个场景之前在 Spring 中做一些事情。为此,您可以使用 Springs [测试执行侦听器][2]。
cucumber-spring
与 Spring TestContextManager
集成,因此基本上应该按预期工作。
如果您想手动激活某些功能,可以使用
@CucumberContextConfiguration
注释。
@CucumberContextConfiguration
@TestExecutionListeners(...your test execution listeners)
@SpringBootTest
public class CucumberSpringConfiguration {
}