4

目前,我正在使用 Spring 将步骤类注入到 JUnit 测试中:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration...
class MyTest extends JUnitStories {
    @Autowired private MySteps mySteps;

    public List<CandidateSteps> candidateSteps() {
        return new InstanceStepsFactory(configuration(), mySteps).createCandidateSteps();
    }

    ...
}

我想用多个线程运行 JBehave,所以我不能再注入单例 MySteps bean。

我已阅读http://jira.codehaus.org/browse/JBEHAVE-492但仍然看不到如何解决我的问题。

4

1 回答 1

5

很久以前就有人问过这个问题,但答案是:只在ThreadLocal变量中保持状态,或者更好地将 ThreadLocal 变量包装在您自己的一个类中。例如,拿这个代码

州级

public class State {
   private ThreadLocal<String> state;

   public void setState(String state) {
      this.state.set(state);
   }

   public String getState() {
      return this.state.get();
   }
}

还有步骤

public class Steps {
   private State state;

   public Steps(State state) {
      this.state = state;
   }

   @Given("the following happens: $string")
   public void somethingHappens(String string) {
      state.setState(string);
   }

   @When("who knows")
   public void whoKnows() {
      String stat = state.getState();
   }

   @BeforeScenario
   public void cleanup() {
      state.setState(null);
   }
}

我建议你在场景清除变量之前有一些东西,以防止不同场景之间的任何类型的泄漏。

于 2012-08-30T09:12:42.617 回答