user24502
user24502

Reputation: 1732

Cucumber class extending step definitions and hooks

I want to extend from a "AbstractBase_step" class in java. So I want to have a hook like:

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

which is called for every step file:

public abstract class Hello_Steps extends AbstractBase_Steps {
}

When I do this I get

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

Does somebody has a trick for that?

EDIT: For reusing same step definitions I've created a new Class Common_Steps and included it in the glue path. So its definitions are available for all feature files in the test.

Upvotes: 18

Views: 37083

Answers (3)

amstegraf
amstegraf

Reputation: 597

The only problem is with the cucumber annotations which use AOP and create a proxy class so just move the @Before and @After in your concrete implementations

public class BaseStepDefinition {
    protected void init(){
        PageFactory.initElements(..);
    }
}

public class MyStepDefinition extends BaseStepDefinition {
    @Before
    @Override
    public void init() {
       super.init();
    }
}

Upvotes: 2

Nitish Kumar
Nitish Kumar

Reputation: 221

You can define your @Before steps in stepdefinition and then add method in base class ,

My scenario was to print message in the cucumber jvm report after every steps and to reduce complication here's the solution,

stepdefinition:

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

baseclass method:

public static Scenario scenario;

   public Scenario printResponse_Report(Scenario scenario, String responseStr{
      scenario.write("Response body: \n" +responseStr);
      return scenario;
}

Upvotes: 0

As I understand your problem, you want to reduce the logic for steps. Here is the solution.

1) Define a common class in this case A with steps in a general package like co.com.test

2) Define the steps config to use the base package

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

3) Doesn't inheritance from class B with specific steps to A

It will cause that steps will be searched in all packages and will find the common steps and the specific steps.

Upvotes: 3

Related Questions