Reputation: 1732
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
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
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
Reputation: 31
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