Cucumber-guice:场景范围拦截器?
问题描述:
在我的黄瓜测试中,我想截取我系统边界上的一些调用,然后验证这些调用的参数。Cucumber-guice:场景范围拦截器?
因此,在每个场景中,我执行一些操作,拦截器拦截调用某些外部系统的参数并将它们存储在某个类中,我们将其称为ScenarioContext
。然后这些参数在我的@Then步骤定义中进行验证。
的问题是ScenarioContext
类具有全局@Singleton
范围意味着许多不好的事情,包括无法并行运行,必要情况下每个场景,场景之间无意依赖后手动清理。
黄瓜guice有一个伟大的功能,称为@ScenarioScoped
注释,它允许我有情景范围的类,它的作品就像一个魅力。
我的问题:是否有可能以某种方式使我ScenarioContext
类(使用我的拦截器来存储截获的东西)是“场景范围的”,即,系统将自动每个场景等后清理?
答
A @ScenarioScoped
由黄瓜注入到您的步骤类的依赖性总是为每个场景重新创建。你的工作是确保你在注入的依赖中没有任何静态字段。静态字段属于类而不是实例,因此它们不会为每个新实例清除。
我写了一个blogpost在哪里我分享了Guice之间的状态,这是我想你所问的。
答
是的,这是可能的,只需要适当地使用Guice喷射器。
- Guice允许通过提供者混合范围。所以解决办法是在我的黄瓜级Guice模块中添加以下行:
bind(ScenarioContext.class).toProvider(ScenarioContextProvider.class).in(CucumberScopes.SCENARIO); /*ScenarioContextProvider - my own basic implementation*/
,然后将此提供者传递给拦截器。 - 其他的复杂情况是这样的:在我的情况下,整个应用程序使用自己的Guice喷油器,拦截器必须在那里创建。但
ScenarioContext
住在黄瓜Guice注射器。所以我必须明确地将Provider<ScenarioContext>
对象传递给我的应用程序的Guice模块。
不完全是我的问题的答案。我已经在使用'@ ScenarioScoped'步骤定义,它工作。问题是我不得不使用总是具有单例作用域的拦截器,然后我无法弄清楚如何将单例作用域的拦截器与我想成为场景范围的对象连接起来。 – Alexander