Cucumber-guice:场景范围的拦截器?

时间:2017-09-04 07:48:23

标签: java cucumber guice

在我的黄瓜测试中,我想拦截系统边界上的一些调用,然后验证这些调用的参数。

因此,在每个场景中我执行一些操作,我的拦截器拦截对某些外部系统的调用的参数并将它们存储在某个类中,让我们称之为ScenarioContext。然后在我的@Then步骤定义中验证这些参数。

问题是ScenarioContext类的全局@Singleton范围意味着许多不好的事情,包括无法并行运行场景,必须在每个场景后手动清理它,场景之间无意中依赖

Cucumber-guice有一个很棒的功能叫@ScenarioScoped注释,它允许我使用场景范围的类,它就像一个魅力。

我的问题:是否有可能以某种方式使我的ScenarioContext类(我的拦截器用来存储截获的东西)成为“场景范围”,即自动拥有它在每个场景之后清理等等?

2 个答案:

答案 0 :(得分:0)

始终为每个方案重新创建由Cucumber注入到步骤类中的@ScenarioScoped依赖项。您的工作是确保注入的依赖项中没有任何静态字段。静态字段属于类而不是实例,因此不会为每个新实例清除它们。

我写了一个blogpost,我在Guice的步骤之间分享状态,这是我认为你要问的。

答案 1 :(得分:0)

是的,有可能,只需要正确使用Guice注射器。

  1. Guice允许通过提供商混合范围。因此,解决方案是将以下行添加到我的黄瓜级Guice模块:bind(ScenarioContext.class).toProvider(ScenarioContextProvider.class).in(CucumberScopes.SCENARIO); /*ScenarioContextProvider - my own basic implementation*/,然后将此提供程序传递给拦截器。
  2. 另外的复杂性是:在我的情况下,整个应用程序使用自己的Guice注入器,并且必须在那里创建拦截器。但ScenarioContext生活在黄瓜Guice注射器中。所以我必须明确地将Provider<ScenarioContext>对象传递给我的应用程序的Guice模块。