2012-07-26 4 views
3

안전한 단계, 내가 사용 JUnit 테스트로 단계 클래스를 주입하고있어 봄 :는 현재 멀티 스레드 실행

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

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

    ... 
} 

내가 JBehave with multiple threads를 실행하고 싶습니다, 그래서 주입 할 수 싱글 톤 MySteps 빈.

나는 http://jira.codehaus.org/browse/JBEHAVE-492을 읽었지만 여전히 내 문제를 해결하는 방법을 볼 수 없습니다.

답변

4

이것은 오래전에 질문을 받았지만 대답은 다음과 같습니다. 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); 
    } 
} 

난 당신이 시나리오는 변수를 삭제하기 전에 뭔가를하는 것이 좋습니다을 방지하기 위해 서로 다른 시나리오 사이의 누출.

+0

이 문제를 해결할 더 좋은 방법이없는 것 같습니다. JBehave 단계의 본질 때문에, 그것은 내 경험에서 당신을 불쾌하게 상태있는 디자인으로 강제합니다. – hertzsprung