有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Cucumber类扩展步骤定义和挂钩

我想从java中的“AbstractBase\u步骤”类进行扩展。所以我想要一个钩子,像:

public abstract class AbstractBase_Steps {
    protected Scenario scenario;
    @Before
    public void background(Scenario scenario) {
        this.scenario = scenario;
    }
}

每个步骤文件都会调用它:

public abstract class Hello_Steps extends AbstractBase_Steps {
}

当我这样做的时候,我会

cucumber.runtime.CucumberException: You're not allowed to extend classes that define Step Definitions or hooks. class Hello_Steps extends class AbstractBase_Steps

有人有这样的把戏吗

编辑:为了重用相同的步骤定义,我创建了一个新类Common_Steps,并将其包含在粘合路径中。因此,其定义可用于测试中的所有要素文件


共 (3) 个答案

  1. # 1 楼答案

    您可以在stepdefinition中定义@Before步骤,然后在基类中添加方法

    我的设想是在每个步骤后在报告中打印消息,以减少复杂性这是解决方案

    步骤定义:

       @Before
    public void after(Scenario scenario) {
        this.scenario = scenario;
    }
    

    基类方法:

    public static Scenario scenario;
    
       public Scenario printResponse_Report(Scenario scenario, String responseStr{
          scenario.write("Response body: \n" +responseStr);
          return scenario;
    }
    
  2. # 2 楼答案

    唯一的问题是cucumber注释使用AOP并创建代理类,因此只需在具体实现中移动@Before@After

    public class BaseStepDefinition {
        protected void init(){
            PageFactory.initElements(..);
        }
    }
    
    public class MyStepDefinition extends BaseStepDefinition {
        @Before
        @Override
        public void init() {
           super.init();
        }
    }
    
  3. # 3 楼答案

    我理解您的问题,您希望减少步骤的逻辑。这是解决办法

    1)在本例中定义一个公共类A,其步骤在一般包中,如co.com.test

    2)定义使用基本包的步骤配置

    @CucumberOptions(format = {"pretty", "html:target/html/"},
    features = {"src/test/resources/acceptance/general/general.feature"},
    glue = {"co.com.test"})
    

    3)不使用特定步骤从类B继承到类A

    这将导致在所有包中搜索步骤,并找到常见步骤和特定步骤