如何在每个 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;
}
我的 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;
}