如何在每个 JBehave 故事之前重新实例化我的步骤 class?

How do I reinstantiate my Steps class before each JBehave story?

我的 JBehave 执行器扩展 JUnitStories 以加载和 运行 几个 .story 文件。它覆盖了 stepsFactory 方法,如网络上的许多示例所示:

public class JBehaveTest extends JUnitStories {

    @Override
    public InjectableStepsFactory stepsFactory() {
        return new InstanceStepsFactory(configuration(), new MySteps());
    }

MySteps 是一个 POJO,实现了@Given、@When、@Then 注解的步骤方法。它在内部成员中保持状态,以跟踪在 When 中发生的事情,以便能够在 Then 中正确断言。例如:

public class Steps {

    private Response response;

    @When("I post this and that")
    public void whenIPostThisAndThat() {
        this.response = sendRestRequest();
    }

    @Then("I get an OK response")
    public void thenIGetAnOKResponse() {
        assertThat(response.httpStatus).isEqualTo("200");
    }

在设计这个的时候,我曾期望 JBehave 在开始下一个故事之前重新实例化 MySteps,所以状态被重置了。不幸的是,这不会发生。 stepsFactory 方法在所有故事 运行 之前只调用一次,而 InstanceStepsFactory 使 MySteps 的一个实例在所有故事中保持活动状态。结果,我得到了从一个故事到另一个故事的遗留错误。

强制 JBehave 在下一个故事之前重新实例化 MySteps class 的最佳方法是什么?

@BeforeStory 解决了。至少对我来说足够好了。它不会重新实例化 Steps class,但至少为您提供了一个可以重置内部状态的挂钩。赞美去 Bill Hileman:

public class Steps {

    private Response response;

    @BeforeStory
    public void resetContext() {
        response = null;
    }