在cucumber测试中,我想截获系统边界上的一些调用,然后验证这些调用的参数。
因此,在每个场景中,我都会执行一些操作,我的拦截器会截获一些外部系统调用的参数,并将它们存储在某个类中,我们来调用它 ScenarioContext
. 然后在@then步骤定义中验证这些参数。
问题是 ScenarioContext
类具有全局 @Singleton
范围意味着许多不好的事情,包括无法并行运行场景、需要在每个场景之后手动清理、场景之间的无意依赖性。
cucumber guice有一个很好的特性叫做 @ScenarioScoped
注解,它允许我有场景范围的类,它就像一个符咒。
我的问题是:有没有可能让我 ScenarioContext
类(由我的拦截器用来存储被截获的内容)是“场景范围”,即在每个场景之后自动清理它等等。?
2条答案
按热度按时间vybvopom1#
一
@ScenarioScoped
cucumber注入step类的依赖性总是为每个场景重新创建的。您的工作是确保注入的依赖项中没有任何静态字段。静态字段属于类而不是示例,因此不会为每个新示例清除它们。我写了一篇博文,在这里我和guice分享了两个步骤之间的状态,这是我认为你在问的问题。
dojqjjoe2#
是的,这是可能的,只需要正确使用guice喷油器。
guice允许通过提供者混合作用域。因此,解决方案是在我的cucumber级guice模块中添加以下行:
bind(ScenarioContext.class).toProvider(ScenarioContextProvider.class).in(CucumberScopes.SCENARIO); /*ScenarioContextProvider - my own basic implementation*/
然后把这个提供者传递给拦截器。另一个复杂之处是:在我的例子中,整个应用程序都使用自己的guice注入器,必须在那里创建拦截器。但是
ScenarioContext
住在 cucumber 地里。所以我必须明确地通过Provider<ScenarioContext>
对象到我的应用程序的guice模块。