在我的黄瓜测试中,我想拦截系统边界上的一些调用,然后验证这些调用的参数。
因此,在每个场景中我执行一些操作,我的拦截器拦截对某些外部系统的调用的参数并将它们存储在某个类中,让我们称之为ScenarioContext
。然后在我的@Then步骤定义中验证这些参数。
问题是ScenarioContext
类的全局@Singleton
范围意味着许多不好的事情,包括无法并行运行场景,必须在每个场景后手动清理它,场景之间无意中依赖
Cucumber-guice有一个很棒的功能叫@ScenarioScoped
注释,它允许我使用场景范围的类,它就像一个魅力。
我的问题:是否有可能以某种方式使我的ScenarioContext
类(我的拦截器用来存储截获的东西)成为“场景范围”,即自动拥有它在每个场景之后清理等等?
答案 0 :(得分:0)
始终为每个方案重新创建由Cucumber注入到步骤类中的@ScenarioScoped
依赖项。您的工作是确保注入的依赖项中没有任何静态字段。静态字段属于类而不是实例,因此不会为每个新实例清除它们。
我写了一个blogpost,我在Guice的步骤之间分享状态,这是我认为你要问的。
答案 1 :(得分:0)
是的,有可能,只需要正确使用Guice注射器。
bind(ScenarioContext.class).toProvider(ScenarioContextProvider.class).in(CucumberScopes.SCENARIO); /*ScenarioContextProvider - my own basic implementation*/
,然后将此提供程序传递给拦截器。ScenarioContext
生活在黄瓜Guice注射器中。所以我必须明确地将Provider<ScenarioContext>
对象传递给我的应用程序的Guice模块。