Cucumber中如何在AuthorizationOperation与UserOperation间传递Token?
问题解答
核心结论
可以直接把token从AuthorizationOperation.java传递到UserOperation.java,但不能通过new ScenarioContext()实现——每次new都会生成全新的上下文实例,和你之前在AuthorizationSteps里用Pico容器管理的实例不是同一个,所以拿不到已存储的token。
问题根源
你在两个Operation类里直接new ScenarioContext(),等于创建了和Steps层完全独立的上下文对象,自然读不到之前存的token值。
可行实现方案
方案1:依赖注入共享ScenarioContext实例
让Pico容器把同一个ScenarioContext实例注入到两个Operation类中,而非自行创建:
// AuthorizationOperation.java private final ScenarioContext scenarioContext; // 通过构造方法注入容器管理的ScenarioContext public AuthorizationOperation(ScenarioContext scenarioContext) { this.scenarioContext = scenarioContext; } public void obtainAndSaveToken() { String token = getToken(); // 你的token获取逻辑 scenarioContext.setContext("token", token); }
// UserOperation.java private final ScenarioContext scenarioContext; // 同样注入同一个ScenarioContext实例 public UserOperation(ScenarioContext scenarioContext) { this.scenarioContext = scenarioContext; } public void executeWithToken() { String token = (String) scenarioContext.getContext("token"); // 这里直接使用token执行业务逻辑 }
这样两个Operation共享同一个上下文实例,就能直接读取到token。
方案2:直接通过方法参数传递token
如果不想依赖上下文容器,可简化为直接传递参数:
// AuthorizationOperation.java public String getToken() { return getToken(); // 返回获取到的token }
// 借助Steps层中转(比如在AuthorizationSteps或单独的流程类中) private final AuthorizationOperation authOp; private final UserOperation userOp; // 构造注入两个Operation public YourFlowSteps(AuthorizationOperation authOp, UserOperation userOp) { this.authOp = authOp; this.userOp = userOp; } public void runAuthAndUserFlow() { String token = authOp.getToken(); userOp.doBusinessWithToken(token); // 直接把token传给UserOperation的方法 }
这种方式更直接,无需依赖上下文,适合简单的流程场景。
补充:原方案能运行的原因
你之前在AuthorizationSteps和UserSteps中使用的是Pico容器注入的同一个ScenarioContext实例,存和读的是同一个上下文,所以能拿到token;而自行new的实例和容器管理的实例完全无关,自然返回null。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

